JAVA锁状态
不同级别的锁用来保证并发情况下数据一致性,在JAVA中锁只能单向升级。
从图中可以看出JAVA锁升级一共有4个阶段,锁升级的过程也是系统需要消耗更多资源来保证并发情况下数据一致性的过程。
不同锁存在的意义
偏向锁
- 单次CAS: 在单线程或者单线程重入的场景下,只需要在切换ThreadId时执行一次CAS,节省了锁重入场景下轻量级锁的多次CAS开销。
轻量级锁
- 多次CAS: 在CPU密集型操作场景下,通过多次CAS操作在多个线程之间切换对加锁资源的使用,避免线程在用户态和内核态间切换的开销。
重量级锁
- JAVA保证数据一致性的终极大招,当前需要的开销也是最大的借助操作系统使线程在用户态和内核态间切换。
锁的优缺点
锁级别 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
偏向锁 | 加锁和解锁操作开销可以忽略不计 | 如果是多线程场景则会带来额外的锁撤销开销 | 单线程同步执行 |
轻量级锁 | 多线程竞争不会阻塞 | 始终得不到锁竞争的线程会执行自旋会消耗CPU资源 | CPU密集型操作,可快速释放资源 |
重量级锁 | 保证数据一致性的终极大招 | 用户态和内核态切换开销大 | IO等耗时长场景下需要大的吞吐 |