JavaEE初阶--总结synchronized

目录

一、引言

二、synchronized的基本特点

加锁的工作过程:

1.偏向锁

2.轻量级锁

3.重量级锁

三、锁的优化过程

1.锁消除

2.锁粗化

四、总结


一、引言

  锁在Java中是一个十分重要的内容,所以本篇博客,继续为大家总结一下synchronized的特性,synchronized的使用,synchronized的锁机制。

二、synchronized的基本特点

1.开始时是乐观锁,如果锁冲突频繁,就转换为悲观锁。

2.开始时是轻量级锁,如果锁被长时间持有,就转换成重量级锁。

3.实现轻量级锁的时候大概率用到的自旋锁策略。

4.是一种不公平的锁。

5.是一种可重入的锁。

6.不是读写锁。

此处对各种锁的解释可以观看我的这一篇博客:JavaEE初阶--锁进阶理解-CSDN博客

加锁的工作过程:

JVM将synchronized锁分为无锁,偏向锁,轻量级锁,重量级锁状态。根据情况,依次进行升级。

1.偏向锁

  一个尝试加锁的线程,进入偏向锁的状态,即此时的加锁并不是真正的加锁,如果没有其他线程来竞争,那么就不加锁,如果有其他线程竞争,那么就进入轻量级锁的状态。

2.轻量级锁

轻量级锁是通过CAS实现的。CAS的具体介绍,可观看博客:JavaEE初阶--锁进阶理解-CSDN博客

3.重量级锁

如果竞争进一步激烈,自旋不能快速获取锁状态,就会膨胀为重量级锁。会用到内核提供的mutex。

1.执行加锁操作,先进入内核态。

2.在内核态判定当前锁是否已经被占用。

3.如果该锁没有占用,则加锁成功,并切换成用户态。

4.如果该所被占用,则加锁失败,此时线程进入锁的等待队列,挂起,等待被操作系统唤醒。

5.等到这个锁被释放了,操作系统会重新唤醒这个线程,尝试重新获取锁。

三、锁的优化过程

1.锁消除

有的代码用到了synchronized,但并没有在多线程的环境下。(例如StringBuffer)

2.锁粗化

一段逻辑中,如果出现多次加锁的情况,编译器+JVM会自动进行锁的粗化。

四、总结

本篇博客继续总结了一下synchronized锁的用法以及特性。欢迎大家在评论区讨论,感谢大家观看!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值