前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代码实例详解【可重入锁】和【不可重入锁】区别?

代码实例详解【可重入锁】和【不可重入锁】区别?

作者头像
用户9919783
发布2022-07-26 11:31:18
5890
发布2022-07-26 11:31:18
举报
文章被收录于专栏:后端从入门到精通

首先我们要明白锁的概念,在多线程的场景下,不同的线程一起运行会导致脏数据,为了保证线程安全,这时候便出现了锁的概念,锁可以对代码块,资源,对象上锁,上锁之后,只允许一个线程对其进行操作,其他线程都会进入阻塞状态,这也就是阻塞加锁方法,直到锁释放之后,其他线程才可以获取锁对其操作。

之前文章重点单独介绍过Synchronized和Reentrantlock,不明白的同学可以先看看了解:

currentHashMap的公平锁,可中断响应,限制等待实例

这篇文章主要是介绍可重入锁和不可重入锁,在jdk中synchronized和Reentrantlock,都是可重入锁,为了更高效的性能和防止发生死锁。

可重入锁可以理解为:同一个线程下,外层方法上锁之后,内层调用的方法也能正常获取锁。

下面先用代码介绍对【不可重入锁】的理解。

当testA()方法获取锁之后,在业务里调用testB(),此时因为A的锁未释放,所以B不能获取到锁,这时候B的业务不能正常进行下去,导致A也不能正常释放锁,A和B方法就发生了死锁。这就是不可重入锁。

可重入锁是什么呢?

Jdk中带的基本都是可重入锁,下面就用synchronized实例介绍,在锁住同一个object之后,控制台打印可以看出,threadA调用threadB方法,B和A方法不会发生死锁,业务都能进行下去。

我们自己可以用synchronized + wait + notify来实现不可重入锁,代码如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档