当前位置: 首页 > news >正文

26.Java Lock 接口(synchronized 关键字回顾、可重入锁快速入门、Lock 对比 synchronized)

一、synchronized 关键字

1、synchronized 关键字回顾
  • synchronized 是 Java 中的关键字,是一种同步锁,它修饰的对象有以下几种

    • 修饰一个类:其作用的范围是 synchronized 后面括号括起来的部分,作用的对象是这个类的所有对象

    • 修饰一个方法:被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象

    • 修改一个静态方法:其作用的范围是整个静态方法,作用的对象是这个类的所有对象

    • 修饰一个代码块:被修饰的代码块称为同步语句块,其作用的范围是大括号({})括起来的代码块,作用的对象是调用这个代码块的对象

  • 虽然可以使用 synchronized 关键字来修饰方法,但 synchronized 关键字并不属于方法定义的一部分,因此,synchronized 关键字不能被继承,如果在父类中的某个方法使用了 synchronized 关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上 synchronized 关键字才可以,当然,还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的,但子类调用了父类的同步方法,因此,子类的方法也就相当于同步了

  • 如果一个代码块被 synchronized 关键字修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况

    • 获取锁的线程执行完了该代码块,然后线程释放锁

    • 线程执行发生异常,JVM 会让线程自动释放锁

  • 如果某个获取锁的线程由于要等待 IO 或者其他原因(比如调用 sleep 方法)被阻塞了,但是又没有释放锁,其他线程便只能等待

2、多线程编程步骤(上)
  1. 创建资源类,在资源类中创建属性和操作方法

  2. 创建多个线程,调用资源类中的操作方法

3、售票案例
(1)资源类
  • Ticket 类
package com.my.lock;public class Ticket {// 票数private int number = 40;// 售票方法public synchronized void sell() {if (number > 0) {number--;System.out.println(Thread.currentThread().getName() + " 卖出了一张票 剩下 " + number + " 张");}}
}
(2)多线程测试
  • SellTicket 类
package com.my.lock;public class SellTicket {public static void main(String[] args) {Ticket ticket = new Ticket();// 创建并运行三个售票线程Thread thread1 = new Thread(() -> {for (int i = 0; i < 40; i++) {ticket.sell();}}, "AA");Thread thread2 = new Thread(() -> {for (int i = 0; i < 40; i++) {ticket.sell();}}, "BB");Thread thread3 = new Thread(() -> {for (int i = 0; i < 40; i++) {ticket.sell();}}, "CC");thread1.start();thread2.start();thread3.start();}
}

二、Lock 接口

1、概述
  • Lock 提供了比使用同步方法和语句可以获得的更广泛的锁操作,它允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象
public interface Lock {void lock();void lockInterruptibly() throws InterruptedException;boolean tryLock();boolean tryLock(long time, TimeUnit unit) throws InterruptedException;void unlock();Condition newCondition();
}
  • Lock 接口的实现类有

    • ReentrantLock:可重入锁

    • ReentrantReadWriteLock.ReadLock,ReentrantReadWriteLock.WriteLock:读写锁

2、可重入锁快速入门
  • 可重入锁,ReentrantLock 类,Lock 接口实现类
(1)资源类
  • LTicket 类
package com.my.lock;import java.util.concurrent.locks.ReentrantLock;public class LTicket {// 票数private int number = 40;// 创建可重入锁private final ReentrantLock lock = new ReentrantLock();// 售票方法public synchronized void sell() {// 上锁lock.lock();try {if (number > 0) {number--;System.out.println(Thread.currentThread().getName() + " 卖出了一张票 剩下 " + number + " 张");}} catch (Exception e) {e.printStackTrace();} finally {// 解锁lock.unlock();}}
}
(2)多线程测试
  • LSellTicket 类
package com.my.lock;public class LSellTicket {public static void main(String[] args) {LTicket lTicket = new LTicket();// 创建并运行三个售票线程Thread thread1 = new Thread(() -> {for (int i = 0; i < 40; i++) {lTicket.sell();}}, "AA");Thread thread2 = new Thread(() -> {for (int i = 0; i < 40; i++) {lTicket.sell();}}, "BB");Thread thread3 = new Thread(() -> {for (int i = 0; i < 40; i++) {lTicket.sell();}}, "CC");thread1.start();thread2.start();thread3.start();}
}
3、Lock 对比 synchronized
  • Lock 不是 Java 内置的,synchronized 是 Java 的关键字,因此是内置的,Lock 是一个接口,通过这个接口可以实现同步

  • 采用 synchronized 不需要去手动释放锁,当 synchronized 方法或者 synchronized 代码块执行完之后,系统会自动让线程释放对锁的占用,而 Lock 则必须要用户去手动释放锁,如果没有手动释放锁,就有可能导致出现死锁现象

  • Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用synchronized 时,等待的线程会一直等待下去,不能够响应中断

  • 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到

  • Lock可以提高多个线程进行读操作的效率

  • 在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时 Lock 的性能要远远优于 synchronized

相关文章:

26.Java Lock 接口(synchronized 关键字回顾、可重入锁快速入门、Lock 对比 synchronized)

一、synchronized 关键字 1、synchronized 关键字回顾 synchronized 是 Java 中的关键字&#xff0c;是一种同步锁&#xff0c;它修饰的对象有以下几种 修饰一个类&#xff1a;其作用的范围是 synchronized 后面括号括起来的部分&#xff0c;作用的对象是这个类的所有对象 修…...

机器学习 学习知识点

机器学习 学习知识点 什么是消融实验&#xff08;Ablation experiment&#xff09;&#xff1f;num_step与batch_size的区别python glob.glob()函数认识python的条件判断之is not、is not None、is Nonetqdm介绍及常用方法softmax 激活函数。type_as(tesnor)Python OpenCV cv2.…...

GESP真题 | 2024年12月1级-编程题4《美丽数字》及答案(C++版)

描述 小杨有 n 个正整数&#xff0c;他认为一个正整数是美丽数字当且仅当该正整数是 9 的倍数但不是 8 的倍数。 小杨想请你编写一个程序计算个正整数中美丽数字的数量。 输入描述 第一行包含一个正整数 n&#xff0c;代表正整数个数 。 第二行包含 n 个正整数 a1, a2, a3…...

java并发之AQS

一、简介 AQS&#xff0c;全称&#xff1a;AbstractQueuedSynchronizer&#xff0c;是一个JDK提供的用于构建锁、同步器等线程协作工具类的框架&#xff0c;内部维护FIFO双向队列&#xff08;双向链表实现&#xff09;。 AQS重要属性&#xff1a; // 表示同步状态。它既可以表…...

4 种修复 IPhone 备份输入密码解锁的方法

您是否在 iTunes 中遇到过这样的消息&#xff1a;“输入密码以解锁您的 iPhone 备份”&#xff1f;出现这种情况是因为备份具有加密备份。当您通过 iTunes 为 iPhone 创建此备份时&#xff0c;您需要生成 iTunes 备份密码来保护和加密您的 iPhone 备份。当您想要更改 iPhone 备…...

选课(贪心)

小明是个好学的程序猿&#xff0c;他想在一天内尽可能多的选择课程进行学习。在下列课程中&#xff0c;他能选择的最多课程是几门&#xff1f; 输入格式: 第一行为一个整数n&#xff0c;表示课程总数。接下来每行为x&#xff0c;y&#xff0c;z表示课程名&#xff0c;开始时间…...

【深度学习】Java DL4J基于 LSTM 构建新能源预测模型

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探…...

【linux基础I/O(1)】文件描述符的本质重定向的本质

目录 前言1. 理解C语言的文件接口2. 操作文件的系统调用接口2.1 open函数详解2.2 close函数详解2.3 write函数详解2.4 read函数详解 3. 文件描述符fd详解4. 文件描述符的内核本质5. 怎样理解Linux下一切皆文件?6. 理解输出输入重定向7. 重定向的系统调用8. 总结 前言 “在Lin…...

微服务架构下的慢请求排查与优化策略

目录 一、分析请求路径 二、检查日志 三、进行时序分析 四、检查资源消耗 五、检查并发处理能力 六、检查网络连接 七、从根本上使用服务治理的方式解决问题 八、结语 在当今的数字化时代&#xff0c;企业为了应对快速变化的市场需求和日益增长的用户基数&#xff0c;纷…...

C++ 中 Unicode 字符串的宽度

首先&#xff0c;什么是 Unicode&#xff1f; Unicode 实际上是一个统一的文字编码标准&#xff0c;它出现目的是为了解决不同计算机之间字符编码不同而导致的灾难性不兼容问题。 Unicode 字符集与 Unicode 编码是两种不同的概念。Unicode 字符集实际是对进入标准的所有文字用…...

人工智能在SEO中的应用与关键词优化策略

内容概要 随着科技的迅猛发展&#xff0c;人工智能在搜索引擎优化&#xff08;SEO&#xff09;中的应用逐渐成为业界关注的热点。AI技术不仅可以有效提高关键词的优化策略&#xff0c;还能在提升内容效率、增强用户体验方面发挥重要作用。通过对相关技术的深入探讨&#xff0c…...

spring mvc源码学习笔记之四

pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...

ruckus R510升级到Unleashe后不能访问

ruckus R510 是IPQ4019&#xff0c;升级到Unleashe&#xff0c;它弹窗提示 但是这个IP没办法用&#xff0c;访问不了AP。 必应了一下&#xff0c;官方提示用advance ip scanner扫描。 扫描持续好久&#xff0c;发现IP竟然是从主路由获得。 9090的端口不用填&#xff0c;甚至不…...

【游戏设计原理】47 - 超游戏思维

对于这条原理&#xff0c;我首先想到的是开放世界&#xff0c;或者探索性游戏&#xff0c;这是最能包容各类玩家的游戏类型。这类游戏定义了基本规则&#xff0c;玩家的可操作性很强。就像上图里的沙池一样&#xff0c;里面有滑梯&#xff0c;是规则性比较明确的&#xff0c;而…...

FastAPI vs Flask 专业对比与选择

FastAPI与Flask是两个流行的Python Web框架&#xff0c;它们在构建Web应用程序和API方面各有特点。以下是对这两个框架的详细比较&#xff1a; 一、设计理念与用途 Flask&#xff1a; 是一个轻量级的Python Web框架&#xff0c;基于Werkzeug WSGI工具箱和Jinja2模板引擎。设计…...

【信息系统项目管理师】【综合知识】【备考知识点】【思维导图】第十一章 项目成本管理

word版☞【信息系统项目管理师】【综合知识】【备考知识点】第十一章 项目成本管理 移动端【思维导图】☞【信息系统项目管理师】【思维导图】第十一章 项目成本管理...

xdoj-字符串-556,为什么字符不能被正常读入

目录 题目 代码 测试用例 the input the correct output 问题发现过程阐述 如果把line16中的数组大小11换成line17中的10 case 1 case 2 case 3 如果数组开成11 case4 代码分析 问题描述 Question1 Question2 题目 题目&#xff1a;连续数字字符串提取 问题描述…...

计算机网络——期末复习(5)期末考试样例1(含答案)

考试题型&#xff1b; 概念辨析&#xff15;个、计算与分析&#xff13;个、综合题&#xff13;&#xff0d;&#xff14;个 必考知识点&#xff1a; 概述&#xff1a;协议 体系结构 物理层&#xff1b;本次考核较少 链路层&#xff1a;CSMA/CD 退避二进制算法 &#xff0…...

Docker安装oracle数据库【最新版】

文章目录 1. 安装 Docker 环境2. 拉取 Oracle 镜像3. 查看镜像4. 创建容器5. 进入容器进行配置6. 进行软连接7. 配置 Oracle 环境变量8. 创建软连接9. 切换到 Oracle 用户10. 登录 SQL*Plus 并修改 sys、system 用户密码11. 重新启动数据库12. 解决 "Database Not Open&qu…...

基于STM32的智能门锁系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 用户身份验证模块开锁控制模块状态监控与报警模块数据存储与管理模块控制算法 用户身份验证算法开锁控制算法状态监控与报警算法代码实现 用户身份验证模块实现开锁控制模块实现状态监控模块实现系统调试与优化结论与展望 1. …...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...

C++11 constexpr和字面类型:从入门到精通

文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...

HTML中各种标签的作用

一、HTML文件主要标签结构及说明 1. <&#xff01;DOCTYPE html> 作用&#xff1a;声明文档类型&#xff0c;告知浏览器这是 HTML5 文档。 必须&#xff1a;是。 2. <html lang“zh”>. </html> 作用&#xff1a;包裹整个网页内容&#xff0c;lang"z…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...

AT模式下的全局锁冲突如何解决?

一、全局锁冲突解决方案 1. 业务层重试机制&#xff08;推荐方案&#xff09; Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减&#xff08;自动加全…...