Java性能优化-2

synchronized锁实现
当多个线程访问同一段代码时,会被先放到EntryList集合中,处于block的线程也会被加入该列表
接下来当线程获取到对象的Monitor时,是依靠底层操作系统的Mutex Lock来实现互斥的,也就是说会发生用户态->内核态的切换,线程申请Mutex成功,持有Mutex,其他线程无法获取到Mutex
如果调用wait(),就会释放持有的Mutext,该线程会进入WaitSet集合中

Java性能优化-2_第1张图片

JDK1.6之后对锁进行优化,引入了 偏向锁,轻量级锁,重量级锁
下图是Java对象头的构成,锁升级功能主要依赖Mark Word中锁标志位和释放偏向所标志位

Java性能优化-2_第2张图片
synchronized同步锁是从偏向锁开始,随着竞争激烈升级到轻量级锁,再到重量级锁
偏向锁,当一个线程反复获取锁时,为避免频繁出现用户态到内核态的切换,还需要判断对象头是否持有锁标记,也就是抢到的锁持有的线程ID是否是自己的,如果是则进入偏向锁状态

Java性能优化-2_第3张图片

如果出现多线程竞争,偏向锁会撤销,进入轻量级锁
这种就是CAS自旋,如果超过一定次数次数后,就变成重量级锁
在竞争不激烈,锁占用时间非常短的情况下,自旋锁可以提高系统性能,如果竞争非常激烈CAS反而会占用资源
可以通过JVM启动参数,取消偏向锁,自旋锁

还可以通过减小锁的粒度,还优化性能,比较典型的是集合类中的  ConcurrentHashMap

 

 

 

 

 

 

你可能感兴趣的:(编程语言)