《ReentrantLock与synchronized的区别》

news/2025/1/1 14:01:35/

目录

Synchronized同步锁

synchronized的用法:

ReentrantLock

ReentrantLock和Synchronized的区别


 

Synchronized同步锁

        使用Synchronized关键字将一段代码锁起来,同一时间只允许一个线程访问。只有获取了这把锁的线程才能访问这段代码,并且只有一个线程拥有这把锁。这样就保证了代码的安全性。

synchronized的用法:

        1.修饰实例方法:synchronized修饰实例方法,则用到的锁,默认为this当前方法调用对象。

        只有获取this锁的线程才能访问当前方法。同一时刻只有一个线程持有this锁。

	public synchronized void add() {}public void add1() {synchronized(this) {}}
//使用synchronized关键字修饰方法时,两种写法作用与意义相同

        2.修饰静态方法 :修饰静态方法,用到的锁,默认为当前类的Class对象

	public synchronized static void add() {}

        3.修饰代码块:修饰代码块,用到的锁是可以指定的,为指定的某类对象。        

	Object obj = new Object();public void de() {synchronized(obj) {}}

         当一个线程访问对象的一个synchronized(this)同步代码块时,另一线程仍然可以访问该对象中的非synchronized(this)同步代码块。        

        父类中synchronized修饰的方法,如果子类没有重写,,则该方法仍然是线程安全的;如果子类重写,并没有使用synchronized修饰,则该方法是线程不安全的。

        定义接口方法时,不能使用synchronized关键字;

        构造方法不能使用synchronized关键字,但是可以使用synchronized代码块来进行同步。

        离开synchronized代码块后,该线程持有的锁,自动释放。

ReentrantLock

        ReentrantLock是Java中一种可重入锁。

        重入锁:一个线程,在获取锁后,可以继续获取同一个锁

                

public class Counter {private int count = 0;public synchronized void add(int n) {if (n < 0) {dec(-n);} else {count += n;}}public synchronized void dec(int n) {count += n;}
}
//当执行add()方法后,会继续调用dec()方法,dec方法也需要获取this锁。

         JVM允许同一个线程重复获取同一个锁,这种能被反复获取的锁,叫可重入锁。

        ReentrantLock是可重入锁,synchronized也是可重入锁。

        在获取可重入锁时,要记录这是第几次获取,没获取一次记录+1,每次退出可重入锁,记录-1,减到0时,才会真正释放锁。

public class Counter {private final Lock lock = new ReentrantLock();private int count;public void add(int n) {lock.lock();try {count += n;} finally {lock.unlock();}}
}

        ReentrantLock是JavaSE 核心类库的并发包(java.util.concurrent)提供的可重入锁,所以以防有异常发生,无法正常释放锁所以在创建锁后,在finally中释放锁。

        ReentrantLock还可以尝试获取锁:

                

if (lock.tryLock(1, TimeUnit.SECONDS)) {try {...} finally {lock.unlock();}
}

尝试获取锁,最多等待一秒。一秒后,还未获取到锁,直接返回false,程序可以尝试做一些额外的处理,而不是无线等待。

        所以,ReentrantLock比synchronized更安全,在使用tryLock()失败后不会产生死锁。 

  ReentrantLock内部有三个类:Sync、NonfairSync、FairSync。

        NonfairSync类继承了Sync类,表示采用非公平策略获取锁:每一次都尝试获取锁,不会按照公平等待的原则进行等待,不会让等待最久的线程获得锁。

        FairSync类也继承了 Sync类,表示采用公平策略获取锁:当资源空闲时,它总是会先判断 sync队列是否有等待时间更长的线程,如果存在,则将当前线程加入到等待队列的尾部,实现了公平获取原则。

        ReentrantLock构造函数:默认是采用的非公平策略获取锁。

        ReentrantLock(boolean) 构造函数:可以传递参数确定采用公平策略或者是非公平策略,参数为 true表示公平策略,否则,采用非公平策略。

ReentrantLock和Synchronized的区别

        

ReentrantLockSynchronized
锁实现机制AQS监视器Monitor
获取锁可以通过tryLock()尝试获取锁,更灵活线程抢占模型
释放锁必须显示通过unlock()释放锁自动释放
锁类型支持公平锁和非公平锁非公平锁
可重入性可重入可重入

                

         

     

 

 

        

 

         

 

     

         

 

   


http://www.ppmy.cn/news/956143.html

相关文章

ChatGPT专业应用:生成外贸询盘邮件

正文共 897 字&#xff0c;阅读大约需要 8 分钟 外贸必备技巧&#xff0c;您将在8分钟后获得以下超能力&#xff1a; 生成外贸询盘邮件 Beezy评级 &#xff1a;A级 *经过寻找和一段时间的学习&#xff0c;一部分人能掌握。主要提升效率并增强自身技能。 推荐人 | Kim 编辑者 | …

chatGPT入世,外贸企业如何充分利用?

当今时代&#xff0c;随着互联网的不断发展和普及&#xff0c;越来越多的外贸企业开始意识到数字化转型的重要性。数字化转型不仅可以提高企业的生产效率和质量&#xff0c;更可以提升企业在全球市场的竞争力。在数字化转型的过程中&#xff0c;将ChatGPT和AI数字人相结合是一种…

一文读懂FPC(16)- 关于过孔盖油和过孔开窗的区分

FPC系列文章目录 1.什么是FPC 2.什么是R-FPC 3&#xff0c;FPC的基材 4.FPC基材压延铜和电解铜的区别 5&#xff0c;FPC的辅材 6&#xff0c;FPC常见的四种类型 7&#xff0c;FPC的生产流程简介 8&#xff0c;R-FPC的生产流程简介 9&#xff0c;FPC的发展及应用 10&a…

ChatGPT Plus 会员续费扣款失败如何处理

扣款失败 笔者由于开通 ChatGPT Plus 会员比较早&#xff0c;3月26日一个月就到期了&#xff0c;但是最近几天注意到&#xff0c;虚拟卡上也没有提醒我扣费&#xff0c;还是能继续使用 GPT-4.0&#xff0c;就很奇怪&#xff0c;于是就研究了一番。 PS: 如果有小伙伴还不会开通 …

golang接入chatGPT

1.创建 OpenAI 账户&#xff0c;并获取API 密钥。 2.设置API 密钥和请求 URL 3.使用 map 定义请求体 4.创建HTTP 请求 5.将 API 密钥和请求体添加到请求头中 6.发送请求并处理响应 package mainimport ("bytes""encoding/json""fmt""io/io…

log|nonebot——2|插件nonebot-plugin-chatgpt尝试,失败。

顺利走通&#xff0c;大概了解了nonebot和gocqhttp之后。 尝试先调通nonebot里的chatGPT插件。是有的。 尝试了这个&#xff0c;人最多&#xff0c;教程也写的清晰的GitHub - A-kirami/nonebot-plugin-chatgpt 按照readme教程走。直接核心直接bug 往下翻。 windows10 2023年…

❤️创意网页:HTML5,canvas创作科技感粒子特效(科技感粒子、js鼠标跟随、粒子连线)

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

Ceph 分布式存储之应用

一、创建 CephFS 文件系统 MDS 接口 1、服务端操作 1&#xff09;在管理节点创建 mds 服务 [rootadmin ceph]# cd /etc/ceph [rootadmin ceph]# ceph-deploy mds create node01 node02 node03 [ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.c…