synchronized
2021-04-11 11:04:47 12 举报
学习笔记
作者其他创作
大纲/内容
分代年龄
重量级锁
轻量级锁也可以叫:无锁、自旋锁、自适应自旋锁、CAS自旋
1bit
25bit
用了sync就不需要volatile了
用户态
偏向锁
public void m1(){ synchronized (o) { } synchronized (this) { } } synchronized void m3(){ } synchronized static void m2() { }
可重入
锁状态
2bit
对象内存布局
第一个线程获取锁
当前线程指针JavaThread*
无竞争
29bit
轻量级锁为什么要升级到重量级锁?
GC标志
指向互斥量(重量级锁)的指针
Java中每一个对象都可以作为锁
为了提高获得锁和释放锁的效率
不能锁String、Integer、Long...常量或者基础数据类型!!!
锁升级的过程
unused
GC的时候会降级,但是不重要
Epoch
效率低
非偏向锁 0
多线程竞争锁1、自旋超过10次2、等待锁的线程超过CPU核数的1/2
重量级需要向内核申请,用户态和内核态的切换,比较消耗资源
轻量级锁
锁标志 01
锁的是当前类的Class对象
升级
偏向锁 1
其他线程尝试获取锁
锁的是this当前类的实例对象
无锁态
线程安全
HashCode(如果调用)
轻量级锁是通过自旋的方式,保持数据一致性,自旋是要消耗CPU的资源。一旦等待的线程数过多,一起自旋,就会消耗光CPU的资源。重量级锁有一个等待队列,当线程进入这个队列后,就不再消耗CPU资源了。
不存在降级
jdk1.6 出现自适应自旋锁 不需要进行调优
锁标志 10
数组对象
4bit
锁信息 64bit(8byte)
退出和异常会释放锁
synchronized
普通对象
锁标志 11
内核态
MarkWord
到达全局安全点后,进行检查,如果当前持有偏向锁的线程不处于活动状态,则设置成无锁状态
Synchronized的性能,在特定情况下并不低于CAS。1、线程多2、单线程执行时间长
Tip: synchronized(o)时,最好将对象o设置成final对象。final Object o= new Object() ;以防止o=new Object()的现象发生,锁的对象发生变化,锁就不生效了,并发同样会出现问题。
可见性
指向线程栈中的LockRecord的指针
锁的是对象
锁的是()里配置的对象
锁标志 00
使用场景少,不举例
原子性
0 条评论
下一页