您的位置:首页 > 其它

synchronized 类锁 对象锁

2015-09-08 10:55 417 查看

分类

类锁:在代码中的方法上加了static和synchronized的锁,或者synchronized(xxx.class)的代码段。

对象锁:在代码中的方法上加了synchronized的锁,或者synchronized(this)的代码段。

代码

输出

0

classLock start

com.example.shengshuqiang.helloworld.JavaTest$A@7461e6f7objectLock start

1

com.example.shengshuqiang.helloworld.JavaTest$A@72116e25, lock= java.lang.Object@7cd68e17, oneObjectLock start

2

com.example.shengshuqiang.helloworld.JavaTest$A@69ab3312objectLock start

3

com.example.shengshuqiang.helloworld.JavaTest$A@47420a89objectLock start

4

com.example.shengshuqiang.helloworld.JavaTest$A@3ff76fb9objectLock start

com.example.shengshuqiang.helloworld.JavaTest$A@20fc4b96objectLock start

classLock end

com.example.shengshuqiang.helloworld.JavaTest$A@72116e25, lock= java.lang.Object@7cd68e17, oneObjectLock end

com.example.shengshuqiang.helloworld.JavaTest$A@7461e6f7objectLock end

com.example.shengshuqiang.helloworld.JavaTest$A@69ab3312objectLock end

com.example.shengshuqiang.helloworld.JavaTest$A@20fc4b96objectLock end

com.example.shengshuqiang.helloworld.JavaTest$A@47420a89objectLock end

com.example.shengshuqiang.helloworld.JavaTest$A@3ff76fb9objectLock end

com.example.shengshuqiang.helloworld.JavaTest$A@615608be, lock= java.lang.Object@7cd68e17, oneObjectLock start

classLock start

classLock end

com.example.shengshuqiang.helloworld.JavaTest$A@615608be, lock= java.lang.Object@7cd68e17, oneObjectLock end

classLock start

com.example.shengshuqiang.helloworld.JavaTest$A@694f64d2, lock= java.lang.Object@7cd68e17, oneObjectLock start

classLock end

com.example.shengshuqiang.helloworld.JavaTest$A@694f64d2, lock= java.lang.Object@7cd68e17, oneObjectLock end

classLock start

com.example.shengshuqiang.helloworld.JavaTest$A@286b2962, lock= java.lang.Object@7cd68e17, oneObjectLock start

classLock end

com.example.shengshuqiang.helloworld.JavaTest$A@286b2962, lock= java.lang.Object@7cd68e17, oneObjectLock end

classLock start

com.example.shengshuqiang.helloworld.JavaTest$A@5922fa5a, lock= java.lang.Object@7cd68e17, oneObjectLock start

classLock end

com.example.shengshuqiang.helloworld.JavaTest$A@5922fa5a, lock= java.lang.Object@7cd68e17, oneObjectLock end

结论

锁的本质是判断是否锁住同一个东西,如果竞争的是同一个锁,则互斥。如果不是同一个锁,则相互不影响。

类锁是锁住该类,全局只有一个类A,所以线程对该类的锁获取是互斥的。一定是先输出“class lock start”,然后“class lock
end”,即执行“class lock start”后,别的线程需要等待该方法执行完“class
lock end”,才可以接着执行。必须要等到类A的锁释放后才可以重新获取。
对象锁是锁住该对象,
如果竞争的不是同一个对象,则对象锁的获取相互不影响。上面输出可以看出,连续两个“object lock start”对应的对象this不一样。
如果竞争的是同一个对象,则对象锁的获取互斥。上面输出可以看出,“oneObject
lock start”“oneObject lock end”顺序出行,在执行“oneObject
lock start”后,想要获取该对象锁lock的其他线程必须等待lock锁释放后“oneObject lock end”


参考链接


http://ifeve.com/java-locks/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: