Synchronized和Lock锁的区别,以及用Lock锁实现一个精准唤醒的案例

本文深入解析synchronized关键字的底层实现原理,通过monitor对象确保线程安全。详细解释了线程如何竞争同一对象上的锁,以及wait/notify方法的依赖关系。并通过一个线程调度案例,展示了synchronized的使用。
摘要由CSDN通过智能技术生成

分析synchronized底层:

每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:

1、如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。

2、如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.

3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权。

Synchronized的语义底层是通过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException的异常的原因。调用之前都需要先去竞争同一个对象上的锁(monitor),也就只能互斥的获取到锁,保证了线程安全。(synchronized锁是不可逆的,这也是他的很大的一个缺点,场景,滴滴上班高峰期大家都要打车,为了保证线程安全使用了sync锁,那么等高峰期过了,那些对象还是被sync锁定,因为不可逆,一直是重锁,所有很多时候sync锁都是慎重使用的

案例:

让线程A打印五次,之后让线程B打印10次,然后c打印15次

重复5轮

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值