Synchronized锁升级 - 锁的基本概念及优缺点

文章详细介绍了Java中synchronized锁的三种状态:偏向锁、轻量级锁和重量级锁。偏向锁适用于单线程场景,减少加锁操作提升性能;轻量级锁在多线程交错使用锁时能提高响应速度,而避免线程阻塞;重量级锁则在多线程竞争时导致线程上下文切换,影响性能。不同锁类型在不同场景下有其适用性和优缺点。
摘要由CSDN通过智能技术生成

1.锁的升级

synchronized在JDK1.6的时候做了比较大的改动,在之后的JDK版本中,synchronized存在偏向锁、轻量级锁、重量级锁三种状态

1.1.偏向锁

线程之间不存在竞争行为,在同一时刻至多只有一个线程有获取锁的需求,常见常见为单线程场景

  1. 偏向锁的识别方法
    1. 判断是不是偏向锁的标识是查看调用方法的线程是否只有一个。在多线程编程中,被锁修饰的代码块仅对单个线程访问几乎是不存在的,因此偏向锁鸡肋(但是它也有它的优势之处,比如偏向锁对偏向线程是不会再有加锁的动作,从而就节省了CAS替换对象头中Mark Word中偏向线程ID的操作,进而提升了锁的性能)如果能够明确单一线程调用同步方法,使用无锁编程更为合适
  2. 性能比较
    1. 无锁和偏向锁的性能差异非常接近,几乎可以忽略不计

1.2.轻量级锁

线程之间存在锁的伪竞争行为,即在同一时刻绝对不存在两个及以上线程同时申请同一把锁,各个线程尽管都有使用锁的需求,但是是交替(交错)使用

  1. 轻量级锁的识别方法
    1. 当两个及两个以上线程不在同一时刻调用被锁修饰的方法,那么至少可以确定是轻量级锁
  2. 性能比较
    1. 轻量级锁由于同一时刻不存在两个及两个以上线程互相竞锁,因此不存在线程堵塞-唤醒的上下文切换,性能相对重量级锁要高很多

1.3.重量级锁

线程之间存在实质性的竞争行为,线程之间都有获取锁的需求,但是时间不可交错,互斥锁的堵塞等待

  1. 重量级锁的识别方法
    1. 当能够肯定至少两个及以上线程调用锁修饰的方法时,线程调用方法的顺序是随机的,那么大概率就是重量级锁
  2. 性能比较
    1. 重量级锁由于涉及到线程堵塞-唤醒上下文切换,造成的性能损耗相对无锁态要低很多

2.锁的优缺点

锁的类型优点缺点使用场景
偏向锁加锁和解锁不需要额外的消耗,和执行非同步方法相比仅存在纳秒级的差距如果线程之间存在锁竞争,会带来额外的锁的消耗适用于单线程访问同步块场景
轻量级锁竞争的锁不会堵塞,提高了程序的响应速度如果始终得不到锁的竞争线程,使用自旋尝试获取锁将会消耗CPU,导致CPU空转追求响应速度,同步块执行速度非常快
重量级锁线程竞争不会使用自旋,不会消耗CPU线程堵塞,响应时间缓慢追求吞吐量,同步块执行时间较长
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值