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

 

posted @ 2022-03-07 21:58  showMeTheCodes  阅读(105)  评论(0编辑  收藏  举报