深入理解Java并发锁

news2024/11/25 4:41:32

图片

在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.coloradmin.cn/o/1846075.html

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

相关文章

【系统设计】如何权衡范式与反范式设计

一、什么是范式设计与反范式设计 1.1、范式设计(Normalization) 定义: 范式设计是数据库设计中最基础的设计原则之一,它主要通过规范化数据模型,减少数据冗余和数据不一致的问题。 常用的范式: 第一范式…

Nginx 负载均衡实现上游服务健康检查

Nginx 负载均衡实现上游服务健康检查 Author:Arsen Date:2024/06/20 目录 Nginx 负载均衡实现上游服务健康检查 前言一、Nginx 部署并新增模块二、健康检查配置2.1 准备 nodeJS 应用程序2.2 Nginx 配置负载均衡健康检查 小结 前言 如果你使用云负载均衡…

js中的window和Window

示例: window.name name; console.log(window.name) // name console.log(Window.name) // Window由此可见Window和window是有区别的。 console.log(Object.prototype.toString.call(Window)); // [object Function] console.log(Object.prototype.toString.c…

论文:R语言数据分析之机器学习论文

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 一、研究背景 全球范围内,乳腺癌是导致癌症发病率和死亡率的主要疾病之一。根据2018年…

微软 Florence-2:多功能视觉模型

微软开发的 Florence-2 系列模型,使用提示(prompt-based approach)来处理不同的视觉任务。 通过改变提示,模型可以执行不同的任务,例如: 描述(Caption)详细描述(Detail…

代码随想录算法训练营第二十八天

题目:134. 加油站 暴力方法 暴力的方法很明显就是O(n^2)的,遍历每一个加油站为起点的情况,模拟一圈。 如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。 暴力的方法思路比较简单…

NGINX_十六 nginx 错误页面配置

十六 nginx 错误页面配置 nginx错误页面包括404 403 500 502 503 504等页面,只需要在server中增加以下配置即可: #error_page 404 403 500 502 503 504 /404.html;location /404.html {root /usr/local/nginx/html;}注意: /usr/local…

PostgreSQL性能优化之分区表 #PG培训

在处理大规模数据时,PostgreSQL的性能优化是一个非常重要的话题,其中分区表(Partitioned Tables)是提高查询和数据管理效率的重要手段。本文将详细介绍PostgreSQL分区表的概念、优势、创建与管理方法以及一些常见的优化策略。 #P…

qml:一个基础的界面设计

文章目录 文章说明效果图重要代码说明组件矩形卡片窗口最大化后组件全部居中菜单栏Repeater实现重复8行图片加载直接加载图片文本转图片FluentUI中可供选择的图标 文章说明 qt6.5.3 qml写的一个界面配置设计软件,目前不含任何c代码,纯qml。windoms风格的…

【Java】已解决java.net.HttpRetryException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例 已解决java.net.HttpRetryException异常 在Java的网络编程中,尤其是使用Apache HttpClient或其他类似的HTTP客户端库时,可能会遇到java.net.HttpRetryException异常。这个…

华为200人园区网有线和无线

实验描述: 1 内网有有线业务、内部无线、外部无线三种业误。 2 内网服务器配置静态IP,网关192.168.108.1。 3 sW1和R1之间使用v1an200 192.168.200.9/30 互联。 4 R2向运营商申请企业宽带并获得了1个固定公网IP: 200.1.1.1 子网掩码 255.255.…

VMware虚拟机下载安装Windows Server 2016

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等…

Docker常用操作和命令

文章目录 1、卸载旧版本 2、yum安装Docker CE(社区版) 3、添加镜像加速器 4、docker --version 查看docker版本 5、docker info 或 docker system info 显示 Docker 系统的详细信息,包括容器、镜像、网络等 6、docker search 搜索镜像 …

MEMS环境传感器生产测试的挑战与未来趋势

微机电系统 (MEMS) 环境传感器无处不在,默默地支撑着我们日常生活中众多设备的功能。从智能手机和可穿戴设备到智能家居和工业自动化,这些微型产品可以测量温度、压力、湿度和大量其他环境参数。 由于环境监测需求不断增长以及空气质量严格法规的实施&am…

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

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

极狐GitLab落户香港科学园并成功发布AI产品驭码CodeRider国际版

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…

189.二叉树:将有序数组转换为二叉搜索树(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

canvas绘制红绿灯路口(二)

系列文章 canvas绘制红绿灯路口(一) 无图不欢,先上图 优化项: 一:加入人行道红绿信号 二:加入专用车道标识(无方向标识时采用专用车道标识) 三:东南西北四项路口优化绘…

汇凯金业:现货黄金投资平仓策略有哪些

现货黄金作为全球投资者广泛关注与参与的财富增值途径,其双向交易制度为市场参与者在不同行情下提供了盈利的可能。然而,如何在波动的市场中把握最佳的平仓时机,从而最大化收益,是所有投资者心中的疑问。正确的平仓策略可以说是现…

【GD32F303红枫派使用手册】第二十节 SPI-SPI NAND FLASH读写实验

20.1 实验内容 通过本实验主要学习以下内容: SPI通信协议,参考19.2.1东方红开发板使用手册 GD32F303 SPI操作方式,参考19.2.2东方红开发板使用手册 NAND FLASH基本原理 SPI NAND介绍 使用GD32F303 SPI接口实现对GD5F1GQ5UEYIGY的读写…