线程同步---synchronized2.? 如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,
线程同步---synchronized
2.? 如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。 这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=677720
1 楼 benlsoft 2007-10-18 LinuxFans写得很透彻呀,我在公司的开发中就曾经遇到过这种情况,现在看了LinuxFans的分析,很受启发。谢谢。 2 楼 wangzhongjie 2007-10-19 LinuxFans写得很明白,一直对线程比较迷糊,现在比较理解了^_^,1ku 3 楼 wwjholmes 2007-10-30 synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。
这个instance变量和object reference是不是有重叠了,总觉得这么划分不是很清晰。instance变量怎么解释?请教 4 楼 LinuxFans 2007-11-01 对,是有重叠!
谢谢,指正! 5 楼 從未忘記 2008-01-23 还是不太明白这个类名称字面变量锁,不知楼主可否详细讲解一下?比如说methodAAA()方法锁定的是当前类的对象,当这个对象在多线程中调用methodAAA()就会形成排斥,达到同步的效果,而methodBBB()方法锁定的是这个类名称字面变量,想问怎么才会形成排斥,达到同步的效果?
6 楼 dwangel 2008-01-24 從未忘記 写道还是不太明白这个类名称字面变量锁,不知楼主可否详细讲解一下?比如说methodAAA()方法锁定的是当前类的对象,当这个对象在多线程中调用methodAAA()就会形成排斥,达到同步的效果,而methodBBB()方法锁定的是这个类名称字面变量,想问怎么才会形成排斥,达到同步的效果?
那个拿到了P1对象锁的线程,才可以调用P1的同步方法 7 楼 從未忘記 2008-01-24 也许我的问题说得不是很清楚,我的意思是这个类名称字面变量锁用在何种情况下? 8 楼 LinuxFans 2008-01-31 对不起,最近项目比较忙,没有时间登陆博客了。请原谅。
理解锁,我个人觉得不要太深究了,只要以范围的思想去理解究可以了。
9 楼 andy54321 2008-07-01 说实话,看了这个我还真有点迷糊了
没理解,
其实是不是就是
【
synchronized方法,只能由其所属class的对象在同一时间单一调用;
synchronized代码块,只能由其所属方法的所属class的对象在同一时间单一调用
】
?