深入理解Java并发锁

图片

在Java中,并发锁是用来控制多个线程对共享资源的访问,确保数据的一致性和完整性。Java提供了多种并发锁机制,包括内置锁(synchronized)、显示锁(如ReentrantLock)、原子变量、并发容器以及一些高级技巧如乐观锁和String.intern()等。

1. synchronized关键字

特点:

synchronized是Java内建的锁机制,它提供了隐式锁,也称为内部锁或监视器锁。

当一个线程获得对象的锁后,其他试图获取该锁的线程将会被阻塞,直到锁被释放。

实现原理:

每个对象都有一个内置锁和一个计数器。当线程请求锁时,JVM将计数器加一。

如果线程已经持有锁,计数器会再次增加,这允许同一个线程多次同步。

当线程完成同步代码块时,计数器减一。当计数器为零时,锁被释放。

使用场景:

适用于方法或代码块的简单同步。

优点:

简单易用,不需要手动释放锁。

缺点:

不能被中断;不支持公平性;无法设置超时。

代码示例:


public class SynchronizedExample {private Object lock = new Object();public void method() {synchronized (lock) {// 临界区代码}}
}

2. ReentrantLock

特点:

ReentrantLock是一个可重入互斥锁,由java.util.concurrent.locks包提供。

支持公平锁和非公平锁。

实现原理:

基于AbstractQueuedSynchronizer(AQS)框架实现。

维护了一个状态变量来跟踪锁的状态。

使用场景:

适用于需要高度自定义和灵活的同步控制的场景。

优点:

高度灵活,支持中断、超时、公平性。

缺点:

必须手动释放锁,否则可能导致死锁。

代码示例:


import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private final ReentrantLock lock = new ReentrantLock();public void method() {lock.lock();try {// 临界区代码} finally {lock.unlock();}}
}

图片

3. ReadWriteLock

特点:

允许多个读线程同时访问,但只允许一个写线程。

读写锁通常用于读多写少的场合。

实现原理:

通过两个锁来实现:一个读锁和一个写锁。

读锁是共享的,写锁是独占的。

使用场景:

适用于读多写少的数据结构,如缓存系统。

优点:

提高并发性能,减少锁竞争。

缺点:

写操作可能会饥饿,如果读操作持续不断。

代码示例:

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockExample {private final ReadWriteLock rwLock = new ReentrantReadWriteLock();public void read() {rwLock.readLock().lock();try {// 读操作代码} finally {rwLock.readLock().unlock();}}public void write() {rwLock.writeLock().lock();try {// 写操作代码} finally {rwLock.writeLock().unlock();}}
}

4. StampedLock

特点:

StampedLock支持乐观读、悲观读、写锁和锁的升级。

它提供了一个版本号来避免不必要的唤醒。

实现原理:

使用了一种称为“乐观读”的技术,通过标记来避免长时间的等待。

使用CAS操作来尝试获取和释放锁。

使用场景:

适用于高并发且读多写少的场景。

优点:

高性能,特别是在高并发环境下。

缺点:

相对复杂,需要更小心地管理状态。

代码示例:

import java.util.concurrent.locks.StampedLock;public class StampedLockExample {private final StampedLock stampedLock = new StampedLock();public void method() {long stamp = stampedLock.writeLock();try {// 临界区代码} finally {stampedLock.unlockWrite(stamp);}}
}

5. Semaphore、CountDownLatch和CyclicBarrier

这三个工具类虽然不是锁,但它们常用于多线程的同步控制。

Semaphore: 控制同时访问特定资源的线程数量。适用于限制并发线程数。

CountDownLatch: 允许一个或多个线程等待其他线程完成操作。适用于等待一组线程完成任务后再执行的场景。

CyclicBarrier: 允许一组线程相互等待,直到所有线程都准备好再同时执行。适用于多线程计算数据的场景。

总结

Java提供了丰富的并发锁和同步工具,以满足不同的并发需求。从简单的synchronized到复杂的StampedLock,每种锁都有其适用场景和特定的优缺点。了解这些并发工具的原理和使用方式对于编写高效且线程安全的Java程序至关重要。在实际开发中,选择合适的锁取决于具体的需求、性能考虑以及代码的复杂性。

图片

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

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

相关文章

计算机考研|20所超高性价比院校,别错过!

这题我太会了,给大家推荐20所性价比非常高的计算机考研院校! 985和211都有,这些学校不搞歧视,公平竞争,非常有能力的同学报考。 ✅厦门大学 (985):不歧视双非,全靠实力,校园环境还…

vscode安装所需插件 个人记录版

vscode安装所需插件 个人记录版 仅做参考 设置

通信系统的最佳线性均衡器(2)---自适应滤波算法

本篇文章是博主在通信等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对通信等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在通信领域笔记:…

好用的便签是什么 电脑桌面上好用的便签

作为一名文字工作者,我经常需要在繁杂的思绪中捕捉灵感,记录下那些一闪而过的想法。在寻找一款适合电脑桌面的便签应用时,我偶然发现了敬业签便签软件简直是为我量身定制的,它不仅界面简洁,操作便捷,更重要…

`THREE.PointsMaterial` 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。

demo案例 THREE.PointsMaterial 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。下面是对其构造函数的参数、属性和方法的详细讲解。 构造函数 const material new THREE.PointsMaterial(parameters);参数&am…

阿里AI图片编辑新项目,人人都可做设计师。MimicBrush本地一键整合包下载

最近阿里巴巴联合香港大学开源了一个创新图像编辑工具:MimicBrush,这个工具相当于是一个局部重绘工具。它通过先进的AI技术,能够将一张图片的某一部分融合到另一张图片上。 MimicBrush,一款颠覆传统的图像编辑神器,不过…

深度学习 --- stanford cs231学习笔记四(训练神经网络的几个重要组成部分之一,激活函数)

训练神经网络的几个重要组成部分 一 1,激活函数(activation functions) 激活函数是神经网络之于线性分类器的最大进步,最大贡献,即,引入了非线性。这些非线性函数可以被分成两大类,饱和非线性函…

一站式家装服务管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,装修风格管理,主材管理,用户管理,基础数据管理 前台账户功能包括:系统首页,个人中心,装修风格&#xff0…

Chained Together卡顿严重怎么办 链在一起卡顿频繁的解决方法

链在一起/Chained Together这款游戏特别适合四个人一起玩,游戏里四个玩家将会被锁链“链在一起”,然后一起在各个地图闯关,不仅考验玩家们的默契配合,还考验智慧和勇气。在链在一起中,玩家需要根据地形和岩浆的分布情况…

淘宝订单物流信息获取:详细操作指南

一、前言 淘宝作为中国最大的电商平台之一,其订单管理系统为商家提供了丰富的接口,用于查询、管理和跟踪订单信息。本指南将详细介绍如何通过淘宝订单接口获取物流信息,帮助商家更好地管理订单和提供优质的物流服务。 二、获取物流信息的步…

php框架的文档和社区支持如何?

在选择 php 框架时,文档和社区支持至关重要,拥有全面的文档和庞大活跃的社区,而 symfony 的文档内容丰富但更适合高级开发人员。codeigniter 4 的文档易于理解,社区规模较小但活跃。yii 2 的文档全面深入,但格式可能令初学者困惑。…

牛拜克拉丝的wordpress免费企业模板

wordpress免费企业模板 挺简洁实用的wordpress免费企业模板,黄色模板搭建公司网站。 演示 https://www.wpniu.com/themes/40.html

allegro 打开 brd文件时提示 WARNING(SPMHDB-212) 告警 应该如何解决呢?

WARNING(SPMHDB-212) :This design has functionality disabled due tothe current product plus options selected. The following features aredisabled: Maximum Crosstalk, Maximum Peak Crosstalk. [help] 步骤 按下图 将allegro编辑器为可设计高速线相关的…

Elastisearch集群(单节点)

目录 一、文件下载 二、创建linux es用户 三、上传、解压canal、es、kibana 四、配置es通讯证书(生成证书给es配置使用) 五、配置elastisearch 六、修改系统配置 七、添加ik分词器支持(可选) 八、给文件赋值权限 九、设置…

71-TCP协议工作原理及实战

一 服务器端 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> // 专门用于建立TCP连接并传输数据信息 #include <QtNetwork> // 此模块提供开发TCP/IP客户端和服务器的类QT_BEGIN_NAMESPACE namespace Ui { class M…

164万年后的日期解析引发的OOM

名词解释 商家销项发票业务&#xff08;平台给商家开票&#xff09;&#xff0c;是平台提供给商家的工具产品&#xff0c;商家购买了平台的服务&#xff0c;那么平台需要开票给商家。 前言 本文所描述的问题&#xff0c;是应用的OOM引发的接口成功率下跌&#xff0c;排查过程中…

【LLM之NL2SQL】DAIL-SQL论文阅读笔记

研究背景 该研究旨在提供一个全面、系统的评估框架&#xff0c;用于评估基于大型语言模型&#xff08;LLM&#xff09;的Text-to-SQL技术。特别强调了不同的提示工程策略的有效性和效率&#xff0c;以及开源LLM的可行性。研究的重点是评估在零样本和少样本场景下的不同问题表示…

webgis 之 地图投影

地图投影 什么是地图投影目的种类等角投影的分类墨卡托投影Web 墨卡托投影 参考小结 为了更好地展示地球上的数据&#xff0c;需要将地球投影到一个平面上。地图投影是一个数学问题&#xff0c;按照一定的几何关系&#xff0c;将地球上的经纬度坐标映射到一个平面上的坐标。地球…

力扣hot100:(The Last one)287. 寻找重复数(快慢指针,静态链表)

LeetCode&#xff1a;287. 寻找重复数 “暴力” 不懂技巧&#xff0c;那就暴力&#xff01; 哈希表&#xff1a; 时间复杂度&#xff1a; O ( n ) O(n) O(n) 这个题体现不出 O ( n ) O(n) O(n)的作用&#xff0c;因为 n < 100 n < 100 n<100 空间复杂度&…

VirtualBox出错,从主机复制文件,乱改内容

昨天烧录机器&#xff0c;测试对方更新的一个库&#xff1a; 开始正确。后来莫名其妙崩溃。反复烧了几次&#xff0c;都错误。复制了老版本的库&#xff0c;正常。再改回新版本&#xff0c;崩溃。 于是把整个打包目录给了对方&#xff0c;他一对比&#xff0c;发现文件不对&am…