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

JAVA基础:Lock不同的锁形式

1.1 可重入锁

  • synchronized就是一个可重入锁

  • 使用lock时,常用的ReentryLock就是可重入锁

  • 当一个线程在获得a对象锁之后,可以继续重复获得对象锁

  • 代码形式就是 线程调用同步代码段,在没有执行完毕前,又调用了该对象的另一个同步代码段

public class Test4 {public static void main(String[] args) {new ReentrantLock().unlock();Thread t1 = new Thread(()->{t1();  // 0 - 1});t1.start();}public static synchronized void t1(){t2(); // 1 - 2} // 1 - 0public static synchronized void t2(){} //2 - 1
}

  • 当线程1进入同步代码段时,会记录线程1的信息,表示线程1获得了锁,同时锁状态0 - 1

  • 当线程1重复进入需要当前对象锁的同步代码段时,会检测之前检录的线程信息

    如果之前记录的线程信息和当前进入的线程信息相同,说明重入,允许,同时状态1 - 2

    如果之前记录的线程信息和当前进入的线程信息不同,说明新线程访问,加入同步队列等待。

  • 当前线程离开同步代码段时,会释放锁,本质就是状态 2 - 1 或 1 - 0

注意:

  • 针对于Lock锁,加锁的数量和释放锁的数量应该保持相同。

  • 否则会产生死锁。

  • synchronized 和 lock都可能会产生死锁

    • synchronized 两个线程同时需要彼此所占有的资源

    • lock最常见的死锁情况,就是获得锁后忘释放了。

1.2 公平锁和非公平锁

  • synchronized 属于非公平锁

  • Lock之ReentryLock创建锁对象时,可以通过传参指定公平或非公平。默认是非公平锁

new ReentryLock(true);//公平锁
new ReentryLock(false);//非平锁

  • 假设, 有n个线程同时访问同步资源,只有1个线程可以获得锁,其他n-1个线程进入同步队列,等待

  • 当然,这n-1个线程,进入同步队列后,会有一个先后顺序

  • 当第一个线程释放锁资源后, 同步队列中那n-1个线程,会按顺序依次获得锁 (倒序 或 顺序)

  • 当线程1释放锁的同时,又来了一个新线程要想要争抢锁

    • 这个新线程,直接存于锁的争抢, 就称非公平锁

    • 这个新线程,直接进入同步队列,等待前面的线程释放锁。 就称公平锁

1.3 排它锁 和 共享锁

  • 排它锁又称为 互斥锁,也称为 独享锁,当一个线程获得该锁, 其他线程无法获得锁,需要等待

    • synchronized就是一个排它锁

    • Lock中提供了不同的实现

  • 共享锁, 多个线程可以同时获得这个锁。

  • 在Lock应用当中,有一个读写锁,就是对排它锁和共享锁的使用

    • 读写就是 共享锁

    • 写锁就是 排它锁

ReentrantReadWriteLock tool = new ReentrantReadWriteLock();
Lock lock1 = tool.readLock();
Lock lock2 = tool.writeLock();

  • 两个线程可以同时获得读锁

  • 两个线程只能有一个获得写锁,另一个等待

  • 一个线程获得读锁, 另一个线程尝试获得写锁会失败,进入等待状态。

  • 一个线程获得写锁, 另一个线程尝试获得读锁会失败,进入等待状态

public class Test5 {public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock tool = new ReentrantReadWriteLock();Lock lock1 = tool.readLock();Lock lock2 = tool.writeLock();Thread t1 = new Thread(()->{lock1.lock();for(int i=1;i<=5;i++){System.out.println(i);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}lock1.unlock();});Thread t2 = new Thread(()->{lock2.lock();for(int i=11;i<=15;i++){System.out.println(i);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}lock2.unlock();});t2.start();Thread.sleep(10);t1.start();}
}

1.4 悲观锁 和 乐观锁

相关文章:

JAVA基础:Lock不同的锁形式

1.1 可重入锁 synchronized就是一个可重入锁 使用lock时&#xff0c;常用的ReentryLock就是可重入锁 当一个线程在获得a对象锁之后&#xff0c;可以继续重复获得对象锁 代码形式就是 线程调用同步代码段&#xff0c;在没有执行完毕前&#xff0c;又调用了该对象的另一个同步…...

【LeetCode每日一题】——679.24 点游戏

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 回溯 二【题目难度】 困难 三【题目编号】 679.24 点游戏 四【题目描述】 给定一个长度为4…...

【Conda】Conda命令详解:高效更新与环境管理指南

目录 1. Conda 更新命令1.1 更新 Conda 核心1.2 更新所有包 2. 严格频道优先级3. 强制安装特定版本4. 创建与管理环境4.1 创建新环境4.2 激活和停用环境4.3 导出和导入环境4.4 删除环境 5. 清理缓存总结 Conda 是一个强大的包管理和环境管理工具&#xff0c;广泛应用于数据科学…...

机器学习:回归模型和分类模型的评估方法介绍

回归模型和分类模型评估方法详解 一、回归模型评估方法 &#xff08;一&#xff09;均方误差&#xff08;MSE&#xff09; 原理 均方误差是衡量回归模型预测值与真实值之间平均平方差的指标。它通过计算预测值与真实值之差的平方的平均值来评估模型的性能。其数学公式为&…...

担心学术窃取?阿里云加密的AI论文工具帮你锁紧数据!

学术窃取是任何研究人员都需要警惕的问题。随着技术的发展&#xff0c;虽然研究工作变得更加高效&#xff0c;但同时也暴露了更多的安全漏洞&#xff0c;尤其是在数据传输和存储过程中。为了解决这一问题&#xff0c;梅子AI论文工具采用了阿里云加密技术&#xff0c;提供了一个…...

leetcode经典算法题总结

针对leetcode算法题常见的五大经典复杂算法进行如下总结&#xff1a; &#xff08;1&#xff09;分治法 把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解…...

运维工具之ansible

Ansible 1.什么是ansible? ​ ansible是基于ssh架构的自动化运维工具&#xff0c;由python语言实现&#xff0c;通过ansible可以远程批量部署等。 2.部署前提 ​ 控制端需要安装ansible,被控制端要开启ssh服务&#xff0c;并允许远程登录&#xff0c;被管理主机需要安装py…...

基于 CSS Grid 的简易拖拉拽 Vue3 组件,从代码到NPM发布(1)- 拖拉拽交互

基于特定的应用场景&#xff0c;需要在页面中以网格的方式&#xff0c;实现目标组件在网格中可以进行拖拉拽、修改大小等交互。本章开始分享如何一步步从代码设计&#xff0c;最后到如何在 NPM 上发布。 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug…...

【华为HCIP实战课程六】OSPF邻居关系排错网络子网掩码问题,网络工程师

一、链路上网络和掩码引发的OSPF邻居问题 R3和R4已经建立正常的ospf邻居关系 更改IP地址前R3接口IP地址 interface Serial2/0/0 link-protocol ppp ip address 10.1.34.3 255.255.255.240 [R3-Serial2/0/0]ip address 10.1.88.2 255.255.255.240 更改为10.1.88.2 R3和R4虽…...

基础教程 | 用VuePress搭建一个简单的个人博客(附源码)

先附上自己个人博客页面&#xff1a;https://illusionno.github.io/ 源码也在这里&#xff1a;https://github.com/illusionno/my-blog &#xff08;如果觉得有帮助&#xff0c;可以点颗star✨&#xff09; 使用的主题是vuepress-theme-reco2.x&#xff0c;并在上面进行了一些调…...

Ubuntu20.04,编译安装BCC

https://github.com/iovisor/bcc/blob/master/INSTALL.md 一、内核配置 In general, to use these features, a Linux kernel version 4.1 or newer is required. In addition, the kernel should have been compiled with the following flags set: CONFIG_BPFy CONFIG_BP…...

# 显卡算力参数对比

显卡算力参数对比 文章目录 显卡算力参数对比A 显卡参数查询B 显卡性能对比&#xff1a; 综合看&#xff1a;T4最具性价比 A 显卡参数查询 查询网址&#xff1a;https://www.techpowerup.com/gpu-specs/ &#xff0c;以下列出部分&#xff1a; Product NameGPU ChipReleasedB…...

掌握RocketMQ4.X消息中间件(一)-RocketMQ基本概念与系统架构

1 MQ介绍 MQ(Message Quene) : 翻译为 消息队列,别名为 消息中间件&#xff0c;通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息&#xff0c;消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的&#xff0c;而且只关心消息的发送和接收&#xff0c…...

实际开发中,java开发的准备工作

实际开发中&#xff0c;java开发的准备工作 一、IDEA工具环境设置 1、编码设置...

SQL进阶技巧:Order by 中 NULLS LAST特性使用?

目录 1 需求描述 2 数据准备 3 问题分析 4 小结 如果觉得本文对你有帮助&#xff0c;想进一步学习SQL语言这门艺术的&#xff0c;那么不妨也可以选择去看看我的博客专栏 &#xff0c;部分内容如下&#xff1a; 数字化建设通关指南 专栏 原价99&#xff0c;现在活动价59…...

Redis:cpp.redis++类型操作

Redis&#xff1a;cpp.redis类型操作 stringsetmsetmgetgetrangesetrangeincrbydecrby listlpushrpushlrangellenlpoprpopblpopbrpop setsaddsmemeberssismemberscardspopsintersinterstore hashhsethgethexistshdelhkeyshvalshmsethmget zsetzaddzrangezcardzremzscorezrank 总…...

感冒用药记录

问题描述&#xff1a;国庆感冒了&#xff0c;头昏喉咙不舒服 用药过程&#xff1a; – 前3天&#xff1a;未用药&#xff0c;不好也不坏 – 中间2天&#xff1a;开始喉痛&#xff0c;使用复方氨酚烷胺胶囊【含对乙酰氨基酚】&#xff0c;基本没有效果 – 后面1天&#xff1a;开…...

JMeter性能测试时,如何做CSV参数化

在现代软件开发中&#xff0c;性能测试是保证应用程序在高负载条件下稳定运行的重要环节。为了实现真实场景的测试&#xff0c;参数化技术应运而生。其中&#xff0c;CSV参数化是一种高效且灵活的方法&#xff0c;可以让测试人员通过外部数据文件驱动测试脚本&#xff0c;从而模…...

爬虫获取不同数据类型(如JSON,HTML)的处理方法以及图片相对URL地址的转换

当我们爬取图片的URL地址时&#xff0c;我们要确保它们都是有效的绝对URL&#xff0c;这样就可以直接用这些URL来下载图片了。但是很多时候&#xff0c;它们都不是绝对URL地址&#xff0c;因此我们需要它进行URL转换。 if img_url.startswith(//): 这个条件检查URL是否以//开头…...

Elasticsearch 实战应用

Elasticsearch 实战应用 引言 Elasticsearch 是一个分布式、RESTful 风格的搜索和分析引擎&#xff0c;能够快速、实时地处理大规模数据&#xff0c;广泛应用于全文搜索、日志分析、推荐系统等领域。在这篇博客中&#xff0c;我们将从 Elasticsearch 的基本概念入手&#xff…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...

【动态规划】B4336 [中山市赛 2023] 永别|普及+

B4336 [中山市赛 2023] 永别 题目描述 你做了一个梦&#xff0c;梦里有一个字符串&#xff0c;这个字符串无论正着读还是倒着读都是一样的&#xff0c;例如&#xff1a; a b c b a \tt abcba abcba 就符合这个条件。 但是你醒来时不记得梦中的字符串是什么&#xff0c;只记得…...