Synchronized锁详解

Synchronized锁详解

1. 前言
sync锁是JVM自带的锁,自动加锁,自动解锁,不同于lock锁,sync锁能修饰方法、变量、代码块等,下面

2. sync的锁升级过程
new - 偏向锁 - 轻量级锁 (无锁, 自旋锁,自适应自旋)- 重量级锁
jdk1.5之前,sync是重量级锁,如果要使用sync的话,他首先会去操作系统去申请一把大锁,但是在之后,sync进行了锁优化,第一个访问这把锁的线程,它会在对象的markword中做一个标记,这就是偏向锁,如果有多个线程去访问资源的时候,他会将偏向锁撤销,换成轻量级锁,如果竞争加剧,那么他就会向操作系统去申请一把重量级锁

3. sync的原理
sync是Java实现同步互斥的一种方式,他会在对象的markword做标记,被sync修饰过的代码块,在被编译的过程中,会生成minitorEnter和minitorExit两个字节码指令,当虚拟机运行到minitorEnter的时候,会尝试获取该对象的锁,如果对象还没加锁或者已经获取到该对象的锁,那么锁计数器就会加一,如果没有获取到对象的锁的话,那么该线程就会阻塞,直到锁被另一个线程释放,当虚拟机运行到minitorExit的时候,锁就会被释放,sync锁实际上实在对象头中添加标记实现的
4. sync是如何确定锁对象的
主要是miniterEnter和miniterExit两个字节码指令中referece对象,即加锁和解锁的对象,使用sync可以修饰不同的对象,因此,锁可以这样确定:
明确指定加锁对象的,比如:sync(this)、sync(T.class);那么,加锁对象即该对象
没有明确指定加锁对象的,分为两种:一种是静态,那么加锁对象就是该类的对象,一种是非静态:那么加锁对象就是当前对象
5. sync不一定比自旋锁慢
如果线程数少,运行时间短的话,那么自旋锁确实比sync锁快的,但是如果自旋的时间太长,线程数又多的话,那么这时候,自旋锁就不占优势了,用自旋锁的话,有很多线程就会占用cpu的资源,这是很不明智的,这时候就需要sync锁,它将线程加入到等待队列中,不需要需要cpu资源

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,synchronized的升级是指在不同的场景下,的实现方式会有所不同,以提高性能和并发控制的效率。下面是synchronized的升级详解: 1. 偏向(Biased Locking):当一个线程访问同步块时,首先会尝试获取偏向。如果偏向未被其他线程占用,则当前线程会获得偏向,并标记为偏向线程ID。这样,在后续进入同步块时,无需再进行的竞争,提高了性能。只有当其他线程尝试获取偏向时,才会撤销偏向状态。 2. 轻量级(Lightweight Locking):当多个线程尝试竞争同一个时,偏向会升级为轻量级。轻量级使用CAS操作来实现加和解,避免了线程阻塞和唤醒的开销。如果CAS操作失败,表示存在竞争,会升级为重量级。 3. 重量级(Heavyweight Locking):当轻量级竞争失败时,会升级为重量级。重量级使用操作系统的互斥量(Mutex)来实现,被阻塞的线程会进入等待状态,直到被释放。重量级的竞争会导致线程的上下文切换和调度开销增加,性能较低。 synchronized的升级过程是根据实际情况和竞争情况动态进行的。在大多数情况下,的升级是逐级升级的,即从偏向到轻量级,再到重量级。这种的升级机制是为了在减少竞争时提供更好的性能,并在存在竞争时保证线程安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值