《ReentrantLock与synchronized的区别》

目录

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.mzph.cn/news/3269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模常用模型(九) :偏最小二乘回归分析

数学建模常用模型&#xff08;九&#xff09; &#xff1a;偏最小二乘回归分析 偏最小二乘回归&#xff08;Partial Least Squares Regression&#xff0c;PLS Regression&#xff09;是一种常用的统计建模方法&#xff0c;用于解决多元线性回归中自变量间高度相关的问题。在偏…

Http 接口测试框架

目录 前言&#xff1a; 实际效果 框架的下一步 最新框架图&#xff08;红色部分未完成&#xff09; 部分代码 你需要做的 前言&#xff1a; 在进行HTTP接口测试时&#xff0c;使用一个可靠的测试框架可以提高测试效率和质量。HTTP接口测试框架是一种用于自动化测试HTTP接…

vue 通过多组复选框来过滤数据

1.通过if else 来筛选数据 <template> <div><div><label><input type"checkbox" v-model"checkedNames" value"北京"> 北京</label><label><input type"checkbox" v-model"chec…

ubuntu 20.04 4090 显卡驱动安装 深度学习环境配置

1. 显卡驱动安装 准备工作&#xff1a; 换源安装输入法&#xff1a;重启的步骤先不管&#xff08;自选&#xff09;sudo apt update && sudo apt upgrade 禁用nouveau驱动&#xff08;这个驱动是ubuntu开源小组逆向破解NVIDIA的开源驱动&#xff0c;与英伟达的原有驱…

Flask_使用flask_marshmallow序列化数据

代码如下&#xff1a; from flask import Flask from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy from marshmallow import fieldsapp Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] "mysqlpymysql://root:12…

网络协议栈介绍

一、网络协议栈 网络协议栈是计算机网络中的重要组件&#xff0c;负责处理网络数据包在不同协议层之间的传递和处理。常见的网络协议栈有以下几种&#xff1a; 1. 基于内核的协议栈&#xff1a;操作系统内核实现的网络协议栈&#xff0c;如Linux的TCP/IP协议栈。 实现原理&a…

Apikit 自学日记:私有云才有的测试文件库功能,该如何使用呢

在 APIkit 的私有云版本中&#xff0c;提供了测试文件库功能。不过目前该功能仅供私有云产品&#xff0c;线上SaaS产品不提供测试文件库功能 API自动化测试中可以添加文件参数。在这里统一管理所有测试文件。 在测试文件库界面&#xff0c;点击上传文件&#xff1a; 在私有云产…

ORACLE的循环

ORACLE的循环 LOOP循环 declare num number; begin num:1; loopdbms_output.put_line(yes);IF num > 10 THENEXIT;END IF;num : num 1; end loop; end;WHILE 循环 declare num stu_info.id%type; beginnum:0;while num<10 loopdbms_output.put_line(num);num:num1;en…

opencv -12 图像运算之按 《位或》 运算(图像融合图像修复和去除)

位或运算 或运算的规则是&#xff0c;当参与或运算的两个逻辑值中有一个为真时&#xff0c;结果就为真。其逻辑关系可以类比为如图 所示的并联电路&#xff0c;两个开关中只要有任意一个闭合时&#xff0c;灯就会亮。 3-5 对参与或运算的算子的不同情况进行了说明&#xff0c;…

7月19日,每日信息差

1、奔驰召回3.2万辆进口汽车&#xff0c;ESP存安全隐患.本次召回范围内车辆由于软件问题&#xff0c;车身电子稳定系统&#xff08;ESP&#xff09;内部监控程序可能会在驾驶循环开始时错误地判定故障&#xff0c;导致车辆动态控制系统的功能受限&#xff0c;存在安全隐患 2、…

Linux操作系统升级低版本的OpenSSH到9.3的高版本

OpenSSH 9.3之前的版本存在各种各样的安全漏洞&#xff0c;为此&#xff0c;我们需要将OpenSSH升级到最新的9.3的版本。 执行&#xff1a;ssh -V&#xff0c;我们可以查看当前的openssh版本 为了避免升级过程中出现意外而导致服务器无法正常使用&#xff0c;建议操作前先对服务…

力扣 406. 根据身高重建队列

题目来源&#xff1a;https://leetcode.cn/problems/queue-reconstruction-by-height/description/ C题解1&#xff1a;分别对h和k两个维度进行考虑&#xff0c;我这里是优先考虑k值&#xff0c;k值相同的时候h小的排前面。然后再一一遍历&#xff0c;对于people[i]&#xff0c…

Nacos报错Could not resolve placeholder ‘order.name‘ in value “${order.name}“怎么解决?

出现这个原因有两个&#xff1a; 1.首先在Nacos配置中心&#xff0c;写入yml配置文件的数据和后端服务在取数据的时候名称不一致 如下图&#xff0c;现在我的配置中心为order-service 看看其中的文件内容信息&#xff1a; 再看看后端是怎么取的&#xff1a; 看出上面错误了吗…

西安---高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术应用

能源是国民经济发展和人民生活必须的重要物质基础。在过去的200多年里&#xff0c;建立在煤炭、石油、天然气等化石燃料基础上的能源体系极大的推动了人类社会的发展。但是人类在使用化石燃料的同时&#xff0c;也带来了严重的环境污染和生态系统破坏。近年来&#xff0c;世界各…

vue写车牌号 自定义键盘

vue写车牌号自定义键盘 <template><div><div class"content-wrapper"><div class"content-top-wrapper"><van-radio-group v-model"radioCarType"><van-radio name"1">蓝牌<imgslot"icon…

什么是渲染?一文看懂,萌新赶紧收藏码住!

十四五规划提出“加快数字化发展&#xff0c;建设数字中国”&#xff0c;数字技术的快速发展&#xff0c;从起初的内容创建到最终的效果呈现&#xff0c;都离不开渲染技术。目前&#xff0c;渲染技术被广泛应用于教育、医疗、影视动画、建筑设计等多个领域。它能有效满足用户对…

ffmpeg的函数调用知识点

av_dump_format 打印的内容是什么意思&#xff1f; av_dump_format 会打印出AVFormatContext的内容&#xff0c;打印的内容是什么意思&#xff1f; 我们使用av_dump_format打印出如下信息&#xff1a; Input #0, mov,mp4,m4a,3gp,3g2,mj2, from https://demo.com/BigBuckBunny.…

Python版Day45

70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 完全背包解法 注意这是求排列问题&#xff0c;1、2步 和 2、1步都是上三个台阶&#xff0c;但是这两种方法不一样 先遍历背包再遍历物…

关于微信小程序 textarea 遇到的坑

1、获取到焦点 键盘弹出时 页面上拉 解决方法 设置adjust-position为false 参考官网&#xff1a;textarea | uni-app官网 textarea的abjust-position属性 例子&#xff1a;注意加&#xff1a; <textarea :adjust-position"false" /> 2、键盘弹出的时…

Java版企业工程项目管理系统源码+java版本+项目模块功能清单+spring cloud +spring boot

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…