Java中synchronized与Lock的区别与使用

Java中synchronized与Lock的区别与使用

当我们谈论Java多线程编程时,线程同步是一个避免资源竞争和保证线程安全的关键概念。在Java中,主要有两种机制来实现线程同步:synchronized关键字和Lock接口。这篇博客将详细介绍这两种同步机制的区别和使用方法,并通过示例来加深理解。

synchronized关键字

synchronized是Java语言内置的同步机制,它基于进入和退出监视器对象(monitor)的概念来提供对代码块或方法的互斥访问。当线程进入一个synchronized方法或代码块时,它会自动获得锁,退出时释放锁。

synchronized方法

当一个方法被声明为synchronized时,它会锁定调用该方法的对象(对于实例方法)或锁定该方法所属的类的Class对象(对于静态方法)。

public class Counter {private int count = 0;public synchronized void increment() {count++;}public synchronized int getCount() {return count;}
}

在上面的例子中,incrementgetCount方法都是同步的,这意味着同一时刻只有一个线程可以执行这些方法中的任何一个。

synchronized代码块

synchronized也可以用来同步代码块而不是整个方法。

public class Counter {private int count = 0;private final Object lock = new Object();public void increment() {synchronized(lock) {count++;}}public int getCount() {synchronized(lock) {return count;}}
}

在这个例子中,我们使用一个私有的锁对象来同步代码块。这种方式提供了更细粒度的控制,可以减少不必要的同步开销。

Lock接口

Lock接口提供了比synchronized更复杂的锁定操作。它允许更灵活的结构,可以尝试非阻塞地获取锁,可以中断锁获取等待,还可以实现公平锁等。

ReentrantLock

ReentrantLockLock接口的一个实现,它具有与synchronized相似的基本行为和语义,但增加了扩展功能。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Counter {private int count = 0;private final Lock lock = new ReentrantLock();public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}public int getCount() {lock.lock();try {return count;} finally {lock.unlock();}}
}

在上面的例子中,我们使用ReentrantLock来保护对count变量的访问。注意lock()unlock()方法的使用,以及unlock()总是在finally块中调用以确保锁定一定会被释放。

公平锁和非公平锁

ReentrantLock允许创建公平锁和非公平锁。公平锁意味着线程将按照它们请求锁的顺序获取锁,而非公平锁则不保证这一点。

private final Lock fairLock = new ReentrantLock(true); // 公平锁
private final Lock unfairLock = new ReentrantLock(); // 非公平锁(默认)

使用公平锁可能会降低性能,但可以减少线程饥饿。

尝试锁定

Lock接口提供了tryLock()方法,允许线程尝试获取锁而不是无限期等待。

public void increment() {if (lock.tryLock()) {try {count++;} finally {lock.unlock();}} else {// 无法获取锁时执行的操作}
}

synchronized与Lock的区别

  1. 锁的控制精细度synchronized关键字自动管理锁的获取和释放,而Lock接口提供了更精细的控制,允许尝试锁定、定时锁定和其他高级功能。
  2. 性能:在Java 5以前,synchronized性能较差,但随着JVM的优化,现在synchronizedReentrantLock的性能已经相当接近。
  3. 条件变量支持Lock接口可以与Condition接口一起使用,提供类似wait/notify的功能,但更灵活。
  4. 锁的公平性ReentrantLock提供了创建公平锁的选项,而synchronized总是创建非公平锁。
  5. 锁的中断处理Lock接口允许在等待锁的过程中响应中断,而synchronized不支持。

何时使用synchronized,何时使用Lock

一般来说,如果需要简单的互斥同步,synchronized是一个很好的选择,因为它更容易理解和使用。当需要更高级的特性,如尝试锁定、定时锁定、中断等待锁的线程或实现公平锁时,应该选择Lock接口。

总结

synchronizedLock都是Java中实现线程同步的重要工具。选择哪一个取决于具体的需求和场景。synchronized更适合代码简洁和少量的同步任务,而Lock提供了更多的灵活性和高级控制,适合复杂的同步需求。无论选择哪种同步机制,始终要确保锁定策略简单,避免死锁,并且合理地管理锁的范围以提高效率。

希望这篇博客能够帮助你更好地理解和使用Java中的synchronizedLock。记住,正确使用同步机制是编写健壮、线程安全的多线程应用程序的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195882.shtml

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

相关文章

专业做除甲醛净化器的品牌 甲醛净化器什么牌子最好用

室内产生了超标的甲醛,大部分都会采取选择甲醛空气净化器来去除,甲醛净化器逐渐成为室内清除甲醛的主力,在选择甲醛净化器时,人们常常会被市场上琳琅满目的空气净化器品牌所迷惑,各品牌和型号都声称自己最好&#xff0…

C++构造函数与析构函数介绍

介绍 C中的构造函数和析构函数是类的特殊成员函数,用于初始化和清理对象。 构造函数是在创建对象时自动调用的函数。它的主要目的是初始化对象的状态。构造函数的名称与类的名称相同,并且它不返回任何类型,也没有参数。析构函数与构造函数相…

freeRTOS创建任务

一.动态创建任务 1.函数xTaskCreate() BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数const char * const pcName, // 任务的名字const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节void * const pvParameters, // …

CCFCSP试题编号:202006-2试题名称:稀疏向量

不断匹配相乘累加就好了 #include<iostream> #include<vector> #include <utility> using namespace std;int main() {int n;int a, b;long long result0; // 使用 long long cin >> n >> a >> b;vector<pair<int, int> > u…

删除不掉node_modules的办法

全局安装 rimraf 模块到系统下&#xff1a; npm install -g rimraf CD 到相应文件夹&#xff0c;执行如下指令&#xff1a; rimraf node_modules

Python面向对象⑤:多态【侯小啾Python基础领航计划 系列(二十三)】

Python面向对象⑤:多态【侯小啾Python基础领航计划 系列(二十三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

pta模拟赛(7-21 求A除以B的商与余数、7-22 一元多项式求导、7-23 一元多项式的乘法与加法运算、7-24 多项式A除以B、7-25 人以群分)

7-21 求A除以B的商与余数 计算A/B的商和余数&#xff0c;其中被除数A是不超过1000位的非负整数&#xff0c;除数B是一个不超过229的任意非负整数。要求你输出商Q和余数R。 输入格式: 输入在一行中依次给出 A 和 B&#xff0c;中间以空格分隔。 输出格式: 在一行中依次输出 Q 和…

minio服务端搭建使用

一.minio文件服务搭建 非docker环境部署(Linux部署) 1.官网下载安装包&#xff1a;MinIO | Code and downloads to create high performance object storage 2、上传安装包文件到目录(这个可以自由选择) /home/minio/ 3、为minio添加权限 sudo chmod x minio 4、 创建mini…

开关柜无线测温系统

开关柜无线测温系统是一种基于无源无线通信技术的开关柜温度监测系统&#xff0c;依托电易云-智慧电力物联网实现高压开关柜接头温度的在线监测和报警。该系统通过在开关柜内部安装无线温度探测器&#xff0c;实时监测开关柜内部的接头、电缆接头、母排等的温度监控&#xff0c…

深入理解 Go 语言中的接口(interface)

一、GoLang 接口的定义 1、GoLang 中的接口 在 Go 语言中接口&#xff08;interface&#xff09;是一种类型&#xff0c;一种抽象的类型接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范不实现&#xff0c;由具体的对象来实现规范的细节…

0年费、0月费、免kyc,支持ChatGPTPlus充值虚拟卡

虚拟卡通常是指银行卡的虚拟卡&#xff0c;是在银行卡的基础上的银联、VISA、万事达卡BIN码衍生出的一种虚拟账户。虚拟卡一般都是用于网络上无卡支付&#xff0c;因此虚拟卡都不会配备相应的实体卡片。银行卡的虚拟卡&#xff0c;在分类上与实体卡并无什么区别&#xff0c;也分…

JAVA 可执行文件格式

JAVA 可执行文件格式 springboot 程序使用 Maven PLugin插件编译时&#xff0c;可以生成可执行的 jar 和 war 程序。其核心原理是 spring-boot-loader 模块&#xff0c;详细原理如下 1 嵌套 JARS java 本身不支持任何标准的加载嵌套 jar 的方式&#xff0c;要解决该问题&…

探秘高级代理技术:SK5代理在网络安全中的应用

在当今数字化时代&#xff0c;网络安全和隐私保护日益受到重视。作为网络工程师和网络文章主编&#xff0c;我将为您介绍一种强大而高级的代理技术——SK5代理&#xff0c;并探讨其在网络安全、爬虫以及HTTP通信中的重要应用。 1. SK5代理简介 SK5代理是一种基于SOCKS5协议的…

学SQL JOINS看这一篇文章就够了

目录 下面以实例进行分析 内连接 inner join 或者join&#xff08;等同于inner join&#xff09; 外连接 left join 或者left outer join(等同于left join) [ left join 或者left outer join(等同于left join) ] [ where B.column is null ] right join 或者right outer…

Docker Registry本地镜像仓库部署并实现远程连接拉取镜像

Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…

Centos系列:shell编程综合练习(个人学习记录)

shell编程综合练习&#xff08;个人学习记录&#xff09; shell编程until 循环跳出循环1. break命令2. continue 命令 Shell函数特殊变量输入输出重定向输出重定向输入重定向重定向 Shell实战监控centos7运行状态/proc/stat文件编写脚本free命令监控系统内存 shell编程 until …

ubuntu几个版本开启或关闭图形界面小结

在下面几个系统做过验证&#xff1a; ubuntu-16.04.7-desktop-amd64&#xff08;内核版本&#xff1a;Linux 4.15.0-112&#xff09; ubuntu-18.04.6-desktop-amd64&#xff08;内核版本&#xff1a;Linux 5.4.0-150&#xff09; ubuntu-20.04.6-desktop-amd64&#xff08;内…

h5网站开发-微信浏览器无法自动播放视频的解决方式?

一、需求&#xff1a; 使用h5开发的网站&#xff0c;首页的banner是一个video视频&#xff0c;在PC端上和手机浏览器上都能正常播放&#xff0c;但是在手机微信浏览器里面视频是无法自动播放的。 二、实现效果&#xff1a; 1.微信浏览器的效果&#xff1a; 2.正常效果&…

如何实现高效代码审查,赋能大规模开发

对于许多企业来说&#xff0c;代码审查都是开发过程中不可缺少的一环。软件开发人员通常会对代码审查感到又爱又恨。一般来说&#xff0c;实施代码审查的企业普遍认为通过及早发现问题和低效率&#xff0c;在长远来看可节省时间。 阅读本篇文章&#xff0c;您将了解到什么是代…

JS浮点数精度问题及解决方案

前端面试大全JS浮点数精度问题及解决方案 &#x1f31f;经典真题 &#x1f31f;浮点数精度常见问题 &#x1f31f;为什么会有这样的问题 &#x1f31f;真题解答 &#x1f31f;总结 &#x1f31f;经典真题 为什么 console.log(0.20.10.3) 得到的值为 false &#x1f31f;…