面试:java中常见的锁

news2024/11/20 10:36:18

文章目录

    • 概述
    • 并发编程三大特性
    • java中常见的锁
      • synchronized关键字(隐式锁)
      • ReentrantLock 类
      • ReadWriteLock 接口
      • StampedLock 类
    • 小结

概述

在Java中,锁是用于控制多个线程对共享资源的访问的一种机制。它有两个主要作用:
保证线程安全:多个线程同时访问共享资源时,锁可以保证线程的有序执行,避免出现竞争条件等线程安全问题。
提高性能:通过锁的机制,可以提高多线程并发访问共享资源的效率,充分利用系统资源。
合理选择锁的类型可以避免不必要的线程阻塞,从而提高程序性能。

并发编程三大特性

原子性(Atomicity):原子性是指一个操作或者一组操作要么全部执行,要么全部不执行,不会被其他操作中途打断。

可见性(Visibility): 可见性是指当一个线程修改了共享变量的值后,其他线程能够立即看到这个修改。

有序性(Ordering):有序性是指程序执行的顺序应该与代码的书写顺序一致。但是由于指令重排序的存在,Java 程序的实际执行顺序可能与代码的书写顺序不一致。在 Java 中,可以使用 volatile 关键字禁止指令重排序。

java中常见的锁

synchronized关键字(隐式锁)

synchronized它的主要作用是确保在同一时刻只有一个线程可以访问被 synchronized 修饰的代码块方法,以避免多线程之间的竞态条件和数据不一致问题。

	public synchronized void synchronizedMethod() {
	    // 同步方法体
	}
	
	
	public void someMethod() {
		//参数lockObject是一个对象引用 通常是一个用来作为锁对象的普通对象
	    synchronized (lockObject) {
	        // 同步代码块
	    }
	}

ReentrantLock 类

ReentrantLock 是 Java 并发包中提供的一种可重入锁,它提供了比 synchronized 更灵活的锁机制。

	ReentrantLock lock = new ReentrantLock();
	lock.lock(); // 获取锁
	try {
	    // 锁保护的代码块
	} finally {
	    lock.unlock(); // 释放锁
	}

ReadWriteLock 接口

在这里插入图片描述

ReadWriteLock 是一个读写锁接口,它包含了两个锁:读锁写锁。读锁用于并发读取操作,多个线程可以同时持有读锁;写锁用于独占写入操作,只允许一个线程持有写锁

ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
readWriteLock.readLock().lock(); // 获取读锁
try {
    // 读取操作
} finally {
    readWriteLock.readLock().unlock(); // 释放读锁
}


readWriteLock.writeLock().lock(); // 获取写锁
try {
    // 写入操作
} finally {
    readWriteLock.writeLock().unlock(); // 释放写锁
}

StampedLock 类

StampedLock 是 Java 8 新增的一种读写锁实现,它提供了乐观读锁(optimistic read lock),悲观读锁(pessimistic read lock)和写锁(write lock)。StampedLock 的性能通常比 ReadWriteLock 更好,但使用时需要注意使用方式和适用场景。
StampedLock通过标记(stamp)来识别锁的状态,从而确保线程安全性。

	StampedLock stampedLock = new StampedLock();
	//获取了一个乐观读锁的标记(stamp)乐观读锁它不会阻塞其他线程的写入操作,因此它适用于读多写少的场景。
	long stamp = stampedLock.readLock(); 
	try {
	    // 乐观读取操作
	} finally {
	    stampedLock.unlockRead(stamp); // 释放乐观读锁
	}
	
	long stamp = stampedLock.writeLock(); // 获取写锁
	try {
	    // 写入操作
	} finally {
	    stampedLock.unlockWrite(stamp); // 释放写锁
	}

小结

synchronized 关键字是最简单和最常用的锁机制之一,可以用于修饰方法或代码块,实现对象级别的锁定。它的优点是使用方便,但灵活性相对较低。

ReentrantLock 是一个可重入锁,提供了比 synchronized 更灵活的锁机制。它支持公平锁和非公平锁,以及可中断的锁等特性,适用于需要更复杂锁定方式的场景。

ReadWriteLock 是一个读写锁接口,包含了读锁和写锁。读锁适用于并发读取操作,写锁适用于独占写入操作。ReentrantReadWriteLock 是其实现类,提供了对读写锁的具体实现。

StampedLock 是 Java 8 新增的一种读写锁实现,提供了乐观读锁和悲观读锁等特性。相比于 ReadWriteLock,StampedLock 的性能通常更好。

比较:
StampedLock 适用于读多写少的场景(因为乐观读锁),可以提供更好的性能;而 ReadWriteLock 则是传统的读写锁机制,适用于一般的读写操作场景。


觉得有用点个赞

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

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

相关文章

Pyqt5中设置matplotlib绘图区背景透明

Pyqt5中设置matplotlib绘图区背景透明 一、前言 最近组里接了学校的某项目,作者是团队里面负责做前端展示的,但是说实话,感觉QT做前端展示真不是很方便,开发过程中遇到不少棘手的问题。 其中一个卡了我一段时间的是界面画图表时…

ASP.NET基于Web的招投标系统的设计与实现

摘 要 招标拍卖的历史悠久,在近两千年的发展历程中,人们对拍卖的理论和技术做了大量的探讨。随着计算机网络技术的迅猛发展和日益成熟,为了提高招投标及采购工作的效率,为廉政建设和防止腐败提供技术保障,传统的拍…

计算机科学与导论 第十六章 安全

文章预览: 16.1引言16.1.1 安全目标16.1.2 攻击 16.2机密性16.2.1 对称密钥密码术16.2.2 非对称密钥密码术 16.1引言 为了安全,信息需要避开未授权的使用(机密性),保护信息不受到未授权的篡改(完整性),并且对于得到授权的实体来说是需要时可…

PSAvatar:一种基于点的可变形形状模型,用于3D高斯溅射的实时头部化身创建

PSAvatar: A Point-based Morphable Shape Model for Real-Time Head Avatar Creation with 3D Gaussian Splatting PSAvatar:一种基于点的可变形形状模型,用于3D高斯溅射的实时头部化身创建 Zhongyuan Zhao1,2, Zhenyu Bao1,2, Qing Li1, Guoping Qiu3,…

OpenWrt One/AP-24.XY 开源路由器发布,OpenWRT与Banana Pi社区合作

OpenWrt One/AP-24.XY 开源路由器 2024 年,OpenWrt 项目将迎来20 周年!OpenWrt 开源社区官方通过推出社区自己的第一个完全上游支持的硬件设计来庆祝这一周年纪念日。并与联发科,Banana Pi开源社区紧密合作,共同完成硬件的设计与…

运行django

确保app被注册 urls.py中编写url 视图对应关系 命令行启动 python manage.py runserver

图数据库Neo4J入门——Neo4J下载安装+Cypher基本操作+《西游记》人物关系图实例

这里写目录标题 一、效果图二、环境准备三、数据库设计3.1 人物节点设计3.2 关系设计 四、操作步骤4.1 下载、安装、启动Neo4J服务4.1.1 配置Neo4J环境变量4.1.2 启动Neo4J服务器4.1.3 启动Ne04J客户端 4.2 创建节点4.3 创建关系(从已有节点创建关系)4.4…

esp32 rst:0xf (BROWNOUT_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)

供电不足导致的 1、第1次出现 电脑usb电压不够,只有3.8V,给esp32s3供电,然后esp32带的模块太多,运行启动就一直报错 2、第2次出现 esp32带的模块单独电池供电,然后一运行MAX98357播放声音就重启 然后换模块单独充电…

月球地形数据介绍(LOLA)

月球地形数据介绍 LOLA介绍LOLA数据的处理与发布数据类型和格式投影坐标系SIMPLE CYLINDRICALPOLAR STEREOGRAPHIC 数据下载与浏览 LOLA介绍 目前最新的月球地形高程数据来源于美国2009年发射的LRO探测器。 “月球勘测轨道器”(Lunar Reconnaissance Orbiter,LRO)…

给一个新项目配置conda环境的完整流程,安装pytorch,dgl

创建环境,并指定python的版本,我这边指定为3.7: conda create --name [自定义的环境名] python3.7我这边假定我的环境名为grand: conda create --name grand python3.7创建成功后,初始化一下conda: source …

easyx库的介绍

前言 如果想要摆脱黑窗口的限制那么easyx图形库是一个好的选择 easyx的初认识 easyx是针对c的图形库,可以帮助c/c上手图形和游戏编程 所以要用easyx必须要用.cpp的后缀 1 easyx的原理 window的图形编程,最终都由window的底层API来实现 2 easyx的颜色 …

2010年认证杯SPSSPRO杯数学建模B题(第一阶段)交通拥堵问题全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 交通拥堵问题 B题 Braess 悖论 原题再现: Dietrich Braess 在 1968 年的一篇文章中提出了道路交通体系当中的Braess 悖论。它的含义是:有时在一个交通网络上增加一条路段,或者提高某个路段的局部通行能力&a…

CRMEB PRO安装系统配置清单

统在安装完成之后,需要对系统进行一系列的配置,才能正常使用全部的功能,以下是官方整理的配置清单

组件安全(Solr、Shiro、Log4j、Jackson、FastJson、XStream)

Solr 主要基于HTTP和 Apache Lucene 实现的全文搜索服务器。 特征&#xff1a;图标识别 端口&#xff1a;8393 CVE-2019-0193&#xff08;远程命令执行漏洞&#xff09; 漏洞版本&#xff1a;Apache Solr < 8.2.0 利用条件&#xff1a; Apache Solr 的 DataImportHandler 启…

线上真实案例之执行一段逻辑后报错Communications link failure

1.问题发现 在开发某个项目的一个定时任务计算经销商返利的功能时&#xff0c;有一个返利监测的调度&#xff0c;如果某一天返利计算调度失败了&#xff0c;需要重新计算&#xff0c;这个监测的调度就会重新计算某天的数据。 在UAT测试通过&#xff0c;发布生产后&#xff0c…

【C++入门】类的6个默认成员函数、运算符重载、初始化列表、const成员、static成员

目录 引言 构造函数 引入构造函数 构造函数的特征 一些细节 析构函数 析构函数的特性 注意事项 拷贝构造函数 书写格式 使用细节 拷贝构造的典型应用场景 运算符重载 意义与格式 注意事项 赋值运算符重载 const成员 两个经典问题 再谈构造函数—初始化列…

『FPGA通信接口』汇总目录

Welcome 大家好&#xff0c;欢迎来到瑾芳玉洁的博客&#xff01; &#x1f611;励志开源分享诗和代码&#xff0c;三餐却无汤&#xff0c;顿顿都被噎。 &#x1f62d;有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩&#xff0c;不出意外被敷衍、被唾弃、被埋在了垃圾堆。…

使用http-parser解析http请求和响应数据

1 简介 http-parser是一个用C编写的HTTP消息解析器&#xff0c;专为高性能HTTP应用程序设计。它能够解析HTTP/1.0和HTTP/1.1的消息&#xff0c;包括头部、主体和连续行。当解析到特定的HTTP元素&#xff08;如请求行、头字段或消息体&#xff09;时&#xff0c;会触发相应的回调…

【前端面试3+1】15 CSS如隐藏元素、css块级元素和行内元素有哪些?两者有什么区别?、JavaScript中“==”与“===”的区别、【丢失的数字】

一、CSS如何隐藏元素&#xff1f; 1、使用 display: none; 这种方法会隐藏元素&#xff0c;并且不占据页面空间。元素会被完全移除&#xff0c;无法通过任何方式显示出来。 .hidden-element {display: none; }2、使用 visibility: hidden; 这种方法会隐藏元素&#xff0c;但仍然…

线段树汇总

线段树是一种二叉搜索树&#xff0c;与区间树相似&#xff0c;它将一个区间划分成一些单元区间&#xff0c;每个单元区间对应线段树中的一个叶结点。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数&#xff0c;时间复杂度为O(logN)。而未优化的空间复杂度为2N&a…