Java基础夯实——2.6 Java中的锁

Java 中,锁(Lock)是用于控制多线程并发访问共享资源的工具。它可以确保在同一时刻只有一个线程能够访问共享资源,从而避免数据不一致的问题。

1. 内置锁(synchronized 关键字)

Java 提供了内置锁,也称为监视器锁,这是最简单和常用的锁机制。

  • 同步方法:锁住整个方法,锁的对象是 this(实例锁)或类对象(类锁)。
    public synchronized void exampleMethod() {// 临界区代码
    }
    
  • 同步代码块:锁定指定对象,粒度更细。
    public void exampleMethod() {synchronized (this) {// 临界区代码}
    }
    

特点

  • 自动获取和释放锁。
  • 简单易用,但可能导致线程阻塞。
  • 不支持尝试获取锁、超时获取锁或中断锁等高级功能。

2. 显式锁(java.util.concurrent.locks.Lock 接口)

显式锁提供了更灵活的锁定机制,允许显式获取和释放锁。

主要实现类

  1. ReentrantLock(可重入锁)

    • 支持公平锁和非公平锁。
    • 允许尝试获取锁、超时获取锁或中断锁。
    Lock lock = new ReentrantLock();
    try {lock.lock(); // 获取锁// 临界区代码
    } finally {lock.unlock(); // 确保释放锁
    }
    
  2. ReentrantReadWriteLock(读写锁)

    • 提供读锁(共享锁)和写锁(独占锁),适合读多写少的场景。
    • 读线程可以并发,写线程则独占。
    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    lock.readLock().lock(); // 读操作
    lock.writeLock().lock(); // 写操作
    

特点

  • 更灵活,支持多种高级功能。
  • 使用时需要手动管理锁的获取和释放,容易引发死锁。
  • 性能可能优于 synchronized,尤其是在高并发情况下。

3. StampedLock

  • StampedLock 是一种改进的读写锁,提供了乐观读锁(Optimistic Read),适合读多写少的场景。

  • ReentrantReadWriteLock 不同,StampedLock 不是可重入的。

    StampedLock lock = new StampedLock();
    long stamp = lock.readLock();
    try {// 读操作
    } finally {lock.unlockRead(stamp);
    }
    

4. 信号量(Semaphore)

  • Semaphore 用于控制同时访问某个资源的线程数量。

  • 常用于限制连接数或资源池的并发访问。

    Semaphore semaphore = new Semaphore(3); // 最大并发数为3
    try {semaphore.acquire(); // 获取许可// 临界区代码
    } finally {semaphore.release(); // 释放许可
    }
    

5. 偏向锁、轻量级锁和重量级锁

  • Java 虚拟机(JVM)底层对 synchronized 的实现进行了优化,包括偏向锁、轻量级锁和重量级锁。
  • 这些锁的选择由 JVM 根据竞争情况动态决定,以提高性能。

比较与选择

特性synchronizedReentrantLockStampedLock
使用难度简单较复杂较复杂
性能较低较高较高
可重入性
读写锁支持支持(需额外类)支持
手动管理锁

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

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

相关文章

小程序25- iconfont 字体图标的使用

项目中使用到图标,一般由公司设计进行设计,设计好后上传到阿里巴巴矢量图标库 日常开发过程中,也可以通过 iconfont 图标库下载使用自带的图标 补充:使用 iconfont 图标库报错:Failed to load font 操作步骤&#xff…

【操作系统】操作系统的特征

操作系统的七个基本特征 并发性(Concurrence) 并发性是指操作系统在同一时间间隔内执行和调度多个程序的能力,提高资源利用率和系统效率。尽管多个任务可能在同一时刻看似同时进行,但实际上,CPU在多个任务之间快速切…

C# 数据结构之【树】C#树

以二叉树为例进行演示。二叉树每个节点最多有两个子节点。 1. 新建二叉树节点模型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace DataStructure {class TreeNode{public int Data { get;…

2024年中国无人机产业研究报告(附产业链图谱)

无人机是指以空气动力为升力来源、无人员搭载的空中飞行器,简称UAV。最初为军事应用而开发,后来被应用于个人消费、地理测绘、影视航拍等越来越多的领域,并在应急救援、通信中继、气象探测等新场景中发挥着重要作用。 近年来,国家…

深入理解Spring(二)

2、Spring应用 2.1、基于xml的Spring应用 2.1.1、SpringBean的配置详解 Spring开发中主要是对Bean的配置,Bean的常用配置一览如下: 1)Bean的基础配置 例如:配置UserDaoImpl由Spring容器负责管理 此时存储到Spring容器(singleObjects单例池)中的Bean的beanName是user…

趋势洞察|AI 能否带动裸金属 K8s 强势崛起?

随着容器技术的不断成熟,不少企业在开展私有化容器平台建设时,首要考虑的问题就是容器的部署环境——是采用虚拟机还是物理机运行容器?在往期“虚拟化 vs. 裸金属*”系列文章中,我们分别对比了容器部署在虚拟化平台和物理机上的架…

Python Matplotlib 数据可视化全面解析:选择它的七大理由与入门简介

Python Matplotlib数据可视化全面解析:选择它的七大理由与入门简介 本文介绍了Matplotlib这一强大而灵活的数据可视化工具,涵盖其基本概念、独特优势以及为何在众多Python绘图库中脱颖而出。Matplotlib具有广泛的社区支持、高度自定义能力、多样的绘图类…

【C++】深入解析 C++ 多态机制:虚函数、动态绑定与抽象类的精髓

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 📘 基础数据结构【C语言】 💻 C语言编程技巧【C】 🚀 进阶C【OJ题解】 📝 题解精讲 目录 📌 前言📌1 多态✨ 1.1 多态的概念 📌 …

【反向迭代器】—— 我与C++的不解之缘(十七)

前言 ​ 在STL中的迭代器部分,之前只关注与正向迭代器,忽视了反向迭代器;现在来看一下反向迭代器到底是个什么东西,以及反向迭代器怎么实现,怎么为之前自己模拟实现的容器增加反向迭代器? 反向迭代器的使用…

无人机与低空经济:开启新质生产力的新时代

无人机技术作为低空经济的核心技术之一,正以其独特的优势在多个行业中发挥着重要作用,成为推动新质生产力革命的重要力量。无人机的应用范围广泛,从农业植保到物流配送,从城市监测到紧急救援,无人机的身影无处不在&…

ElasticSearch7.x入门教程之中文分词器 IK(二)

文章目录 前言一、内置分词器二、中文IK分词器(第三方)三、本地自定义四、远程词库总结 前言 ElasticSearch 核心功能就是数据检索,首先通过索引将文档写入 es。 查询分析则主要分为两个步骤: 1、词条化:分词器将输入…

宏景HCM uploadLogo.do接口存在任意文件上传漏洞

文章目录 免责声明漏洞描述搜索语法漏洞复现nuclei修复建议 免责声明 本文章仅供学习与交流,请勿用于非法用途,均由使用者本人负责,文章作者不为此承担任何责任 漏洞描述 宏景HCM是一款基于先进的人力资本管理体系和灵活开放的技术架构的企…

Linux:confluence8.5.9的部署(下载+安装+pojie)离线部署全流程 遇到的问题

原文地址Linux:confluence8.5.9的部署(下载安装破ji)离线部署全流程_atlassian-agent-v1.3.1.zip-CSDN博客 背景:个人使用2核4g 内存扛不住 总是卡住,但是流程通了所以 直接公司开服务器干生产 个人是centos7 公司…

基于web的音乐网站(Java+SpringBoot+Mysql)

目录 1系统概述 1.1 研究背景 1.2研究目的 1.3系统设计思想 2相关技术 2.1 MYSQL数据库 2.2 B/S结构 2.3 Spring Boot框架简介 3系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2系统性能分析 3.2.1 系统安全性 3.2.2 数据完整性 …

MATLAB绘图基础11:3D图形绘制

参考书:《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 11.3D图形绘制 11.1 3D图概述 M A T L A B {\rm MATLAB} MATLAB的 3 D {\rm 3D} 3D图主要有: 3 D {\rm 3D} 3D散点图、 3 D {\rm 3D} 3D线图、 3 D {\rm 3D} 3D曲面图、 3 D {\rm…

集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码

集合卡尔曼滤波(Ensemble Kalman Filter) 文章目录 引言理论基础卡尔曼滤波集合卡尔曼滤波初始化预测步骤更新步骤卡尔曼增益更新集合 MATLAB 实现运行结果3. 应用领域结论 引言 集合卡尔曼滤波(Ensemble Kalman Filter, EnKF)是…

Bug:gomonkey系列问题(undefined: buildJmpDirective)

Bug:gomonkey系列问题(undefined: buildJmpDirective) 最近拉代码发现其他同事写单测使用的是gomonkey,我本地mac m3芯片执行报错,gomonkey: undefined: buildJmpDirective。 对go convey不熟悉的朋友可以看这篇文章: Go Convey测…

Arcgis 地图制作

地图如下,不同历史时期:

【AI编程实战】安装Cursor并3分钟实现Chrome插件(保姆级)

Cursor介绍 https://www.cursor.com/ 一句话介绍:AI代码编辑器,当前最火的AI编程器 软件下载与安装 下载 打开Cursor官网下载,会根据操作系统的差别进行选择 https://www.cursor.com/ 这里下载的内容很小,是个安装器&#x…

C指针之舞——指针探秘之旅(2)

❤博客主页:折枝寄北-CSDN博客 ❤专栏:C语言学习专栏 在上一篇博客文章:C指针之舞——指针探秘之旅-CSDN博客中,我们学习了字符指针,指针数组,数组指针,数组传参和指针传参等内容,…