可重入锁

755faf5b9925b5235b9897abcba4447a.png

若有收获,请记得分享和转发哦

使用Java进行多线程开发,使用锁是一个几乎不可避免的问题。今天,就让我们来聊一聊这个基础,但是又特别特别重要的话题。

首先,让我们来看一下,到底什么是锁? 以及,为什么要使用锁?

如果有2个线程,需要访问同一个对象User。一个读线程,一个写线程。User对象有2个字段,一个是名字,一个是手机号码。

8f274331c4f3d5312dc467d79eaab815.png

当User对象刚刚创建出来的时候,姓名和手机号码都是空。然后,写线程开始填充数据。最后,就出现了以下令人心碎的一幕:

75a805bf48d5464fc73bd06d065ba4f5.png

可以看到,虽然写线程先于读线程工作,但是, 由于写姓名和写电话号码两个操作不是原子的。这就导致读线程只读取了半个数据,在读线程看来,User对象的电话号码是不存在。

为了避免类似的问题,我们就需要使用锁。让写线程在修改对象前,先加锁,然后完成姓名和电话号码的赋值,再释放锁。而读线程也是一样,先取得锁,再读,然后释放锁。这样就可以避免发生这种情况。

如下图所示:

76d10fac0d61dc6540d8c9ba78c24453.png

ace79b4d448f54d2b6e0d5c30426e152.png

2d9db52fabad8135b7b5b9cfe66e9728.png

f1669e98f2e8824ff6ff3e5ae5a6fcc3.png

95b670027127a1555fcc21c5150b4888.png

50db3a5764ceb8f3b42dee7f7945185f.png

40196071e999abb79ca52741cbfcaa92.png

4b3a9f26a562acc77fd7a8012957e67e.png

78f77dc4ad465efab20d3150fc54dc67.png

5aaf970697ebfe86088c7467f067a06e.png

a631edfd3cdeb3035a501ae7eb98c591.png

e7908d9687d38a363784bbaf744f99ef.png

ff6a23dba6ed8009732268ea48dc4214.png

ad5a13c561adc982036b00f00e966d34.png

fa0adcfcb67797b289bd4483f8f1df60.png

4db65d4b3331aa5ffedd1618f749d590.png

总结

可重入锁算是多线程的入门级别知识点,所以我把他当做多线程系列的第一章节,对于重入锁,我们需要特别知道几点:

  1. 对于同一个线程,重入锁允许你反复获得通一把锁,但是,申请和释放锁的次数必须一致。

  2. 默认情况下,重入锁是非公平的,公平的重入锁性能差于非公平锁

  3. 重入锁的内部实现是基于CAS操作的。

  4. 重入锁的伴生对象Condition提供了await()和singal()的功能,可以用于线程间消息通信。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值