码迷,mamicode.com
首页 > 编程语言 > 详细

java中的synchronized关键字

时间:2015-10-17 23:48:50      阅读:339      评论:0      收藏:0      [点我收藏+]

标签:

参考:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html

多线程问题的根因:

多线程环境下,对一个对象更改的时候,一个线程A对某个变量做了改变,但是还没改变完成能,就被另外一个线程B抢去了cpu,那么A就不会再执行了,因此导致了数据不一致行为。针对上面引文中银行取款存款的例子,本来存一百取一百正好抵消,但是由于多线程的之间的肆意抢占,有些取存款的操作没有完成,自然导致结果千奇百怪。

关键点:

synchronized同步加锁的是对象,而不是代码段,这一点一定要理解。

每个对象只有一个锁与之关联。

synchronized作用的域:

(1)关键字synchronized使用在方法之前,类似synchronized aMethod(){},其实是对实例化对象A加锁。

(1.1)可以防止多个线程同时访问这个对象A的synchronized方法,如果有另一个线程要访问该方法的话,需要等待
(1.2)如果对象A有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法
(1.3)当一个线程访问A的一个synchronized(this)同步代码块时,另一个线程仍然可以访问A中的非synchronized(this)同步代码块
(1.4)不同的对象实例的synchronized方法是不相干扰的。例如有该类的另一个对象实例B,B中的synchronized方法现在可以照常访问

(2)关键字synchronized使用方法中的在代码片段中,类似aMethod(){synchronized(this){/*区块*/}},其实也是对实例化对象A加锁,这样做的目的无非是为了减少加锁的范围,提高效率。

(3)在方法中对类加锁。类似aMethod(){synchronized(Foo.class){}},这种情况是对整个class类加锁。它可以对类的所有对象实例起作用。此时该类的所有实例都收到这个锁的节制,只有获取到锁才能够访问

(4)将类的静态成员函数声明为 synchronized。这种锁对类的所有对象实例起作用。与3类似。

其他:

(1)synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法。

(2)还有,博主关于synchronized,用了房间房间上锁的比喻,非常贴切和易于理解。

 

java中的synchronized关键字

标签:

原文地址:http://www.cnblogs.com/mingziday/p/4888553.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!