synchronized
一、用户态和内核态
内核态:能访问所有指令
用户态:只能访问用户允许访问的指令,JVM工作在用户态
synchronized重量级锁:JVM要向某个资源加锁,要通过用户态向内核态申请资源
二、对象的内存布局
8字节的markword,记录了锁信息,gc信息,hashcode
4字节的类型指针,通过指针可以找到T.class
成员变量
对齐字节:8字节对齐,字节数为8的整数倍
三、锁升级
1、new处理对象后加synchronized锁升级为偏向锁
偏向锁竞争升级为自旋锁
自旋锁自旋超过10次或者自旋线程超过cpu核数的一半则升级为重量级锁,1.6之后jvm帮你调。需要向操作系统申请资源
如果轻量级锁直接调用wait方法,直接升级为重量级锁
2、锁解释
偏向锁:多数synchronized代码在执行时只有一个线程,那么就不需要设置竞争机制。将线程id写到markword中
轻量级锁:有人来竞争锁,撤销偏向锁
每个线程生成各自的LR,谁的LR获取到指针,谁就抢到锁,另一个线程进行CAS抢锁
重量级锁:用户态到内核态申请锁资源
3、为什么有了自旋锁还需要重量级锁?
自旋是消耗cpu性能的,如果时间过长或者自旋线程过多,cpu会被大量消耗
重量级锁中有队列waitSet
4、偏向锁是否一定比自旋锁效率高?
单线程的时候偏向锁效率高
多个线程的时候偏向锁会涉及锁撤销,消耗资源,这时自旋锁效率高
5、为什么要有自旋锁?
自旋锁始终在用户态,避免了内核态的加锁和减锁的过程
四、锁重入
synchronized是一个可重入锁,重入锁必须记录,因为要解锁必须对应次数
偏向锁和自旋锁记录在线程栈,每重入一次LR+1。每解锁一次线程栈弹出一个LR
五、synchronized
1、synchronized锁的是对象。synchronized(o)这里的o不要用String以及基本数据类型
2、在方法上不加任何对象锁的是this,当前类的对象
3、如果是静态方法,锁的是这个类XX.class
作者:http://cnblogs.com/lyc-code/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。