日期:2014-05-20  浏览次数:20680 次

同步代码块实参疑问
想问一下,刚看了同步代码块的内容,同步代码快命令:
1、synchronized(Object.class){}
2、synchronized(obj){}
3、synchronized(new Object()){}
这三种格式有什么区别吗?
这三种方式都可以顺利编译并且运行,但是不清楚之间有什么区别。。。
------解决方案--------------------
synchronized(Object.class){}
synchronized(new Object()){}
这个区别应该是:锁的对象不同,Object.class把锁加在Object类上,new Object()把锁加在Object的实例上面。
也就是说,如果你想同步一些类的static的变量,那么就应该加在Object.class上面。

synchronized(obj){}这个应该是synchronized(new Object()){}类似的,也就是对类的实例上面加锁
------解决方案--------------------
引用:
想问一下,刚看了同步代码块的内容,同步代码快命令:
1、synchronized(Object.class){}
2、synchronized(obj){}
3、synchronized(new Object()){}
这三种格式有什么区别吗?
这三种方式都可以顺利编译并且运行,但是不清楚之间有什么区别。。。


首先来说,这都是一种同步的手法(同步块),在并发编程中很常见;

其次,同步的一个很重要的作用(还有其它作用)是防止并发访问共享数据,既然是共享数据,那你就得明白是哪里的共享数据;
第一个是用于防止访问 方法区 的类数据(静态数据),也就是说这个类的静态数据被多线程并发访问了;
第二个是用于实例变量,也就是某个类的实例会被多线程并发访问,如Collections.synchronizedXXX等系列方法就是这个作用;
第三个没这种用法吧,用于demo中了;