Java中Synchronized的优化

阅读数:38 评论数: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 是自动加锁和