Java中Synchronized的优化
阅读数:58 评论数:0
跳转到新版页面分类
python/Java
正文
一、概述
Synchronized是基于底层操作系统的Mutex Lock实现的,每次获取锁和释放锁都会带来用户太和内核态的切换,从而增加系统性能开锁,从JDK1.6开始,Java对Synchronized同步锁做的优化-锁升级。
二、锁升级
Synchronized同步锁初始为偏向锁,随着线程竞争越来越激烈,偏向锁升级到轻量级锁,最级升级到重量级锁。
1、偏向锁
主要用来优化同一线程多次申请同一个锁的竞争。
在我们的应用中,可能大部分时间是同一个线程竞争锁资源,如果这个线程每次都要获取锁和释放锁,那么就在不断的从内核态与用户态之间切换。
有了偏向锁,当一个线程再次访问这个锁资源时,只需在对象头中的判断一个是否当前线程持有该偏向锁就可以了。
2、轻量级锁
当有另外一个线程竞争获取这个锁时,由于该锁已经是偏向锁,当发现对象头中的线程ID不是自己的线程ID,就会进行CAS操作获取锁,如果获取成功,直接替换对象头中的线程ID为自己的ID,该锁会保持偏向锁状态; 如果获取锁失败,代表当前锁有一定的竞争,偏向锁会升级为轻量级锁。
轻量级锁适用于线程交替执行同步块的场景,绝大部分的锁在事个同步周期内都不会存在长时间的竞争。
3、重量级锁
在轻量级锁状态下,如果自旋获取锁依然失败,那么会进一步升级到重量级锁。
在这个状态,会变成了未优化之前的Synchronized锁。
三、JVM参数优化
1、如果系统常常是多线程竞争,那么禁用偏向锁可能更好
--XX:-UseBiasedLocking
2、如果线程持有锁的时间很长,那么关闭自旋锁可能更好
--XX:-UseSpinning
Synchronized
是基于底层操作系统的 Mutex Lock 实现的,每次获取锁和释放锁的操作都会带来用户态
和内核态
的切换,从而增加系统性能开销。作者:健程之道
链接:https://www.imooc.com/article/293977
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
Synchronized
是基于底层操作系统的 Mutex Lock 实现的,每次获取锁和释放锁的操作都会带来用户态
和内核态
的切换,从而增加系统性能开销。作者:健程之道
链接:https://www.imooc.com/article/293977
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
Synchronized
是基于底层操作系统的 Mutex Lock 实现的,每次获取锁和释放锁的操作都会带来用户态
和内核态
的切换,从而增加系统性能开销。作者:健程之道
链接:https://www.imooc.com/article/293977
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
相关推荐
一、问题原因
1、由于Spring事务是通过AOP实现的。
所以在synchronized修饰的方法执行前会有开启事务,之后会有提交事务逻辑。
// 示例性代码
public static void
一、可重入锁、不可重入锁
Java中提供的synchronized、ReentrantLock、ReenTrantReadWriteLock都是可重入锁(可重入:当前线程获取到A锁,在获取之后尝试再次
Java对象头和Monitor是实现synchronized的基础!
一、Java对象头
对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。
1、Kla
用法不同
synchronized 可以用来修饰普通方法、静态方法和代码块,而 ReentrantLock 只能用于代码块。
获取锁和释放锁的机制不同
synchronized 是自动加锁和