Lock锁子类了解一下

【学习体会】Lighttools8.4.0:矩形阵列光源+条形光源的光学仿真分析 在solidworks中设计了条形光源的基本结构: 由32*6个矩形led组成矩形光源阵列,如下所示 另存为step文件后,导入lighttools中,这里要设置模型的光学属性为:吸收体(机械) 因为我们设计的光源模型是一个整体,我们不能单个面的设置光源,比如说, 这样做的话并不会是这个面设置为光源,而是会把做一个模型都变成一个光源,如下 这显然不是我们想要的 那么,我们就在led位置上放置一个矩形面光源, 这样我们就放置好了一个面光源, 但是问题是,还有191... 阅读详情

前言

回顾前面:

只有光头才能变强!

上一篇已经将Lock锁的基础AQS简单地过了一遍了,因此本篇主要是讲解Lock锁主要的两个子类:

  • ReentrantLock
  • ReentrantReadWriteLock

那么接下来我们就开始吧~

一、ReentrantLock锁

首先我们来看看ReentrantLock锁的顶部注释,来看看他的相关特性呗:

来总结一下要点吧:

  • 比synchronized更有伸缩性(灵活)
  • 支持公平锁(是相对公平的)
  • 使用时最标准用法是在try之前调用lock方法,在finally代码块释放锁

class X {
    private final ReentrantLock lock = new ReentrantLock();
    // ...

    public void m() { 
        lock.lock();  // block until condition holds
        try {
            // ... method body
        } finally {
            lock.unlock()
        }
    }
}

1.1内部类

首先我们可以看到有三个内部类:

这些内部类都是AQS的子类,这就印证了我们之前所说的:AQS是ReentrantLock的基础,AQS是构建锁、同步器的框架

  • 可以很清晰的看到,我们的ReentrantLock锁是支持公平锁和非公平锁的~

1.2构造方法

1.3非公平lock方法

尝试获取锁,获取失败的话就调用AQS的acquire(1)方法

acquire(1)方法我们在AQS时简单看过,其中tryAcquire()是子类来实现的

我们去看看tryAcquire():

1.4公平lock方法

公平的lock方法其实就多了一个状态条件:

这个方法主要是判断当前线程是否位于CLH同步队列中的第一个。如果是则返回flase,否则返回true。

1.5unlock方法

unlock方法也是在AQS中定义的:

去看看tryRelease(arg)是怎么实现的:

二、ReentrantReadWriteLock

我们知道synchronized内置锁和ReentrantLock都是互斥锁(一次只能有一个线程进入到临界区(被锁定的区域))

而ReentrantReadWriteLock是一个读写锁:

  • 在读取数据的时候,可以多个线程同时进入到到临界区(被锁定的区域)
  • 在写数据的时候,无论是读线程还是写线程都是互斥的

一般来说:我们大多数都是读取数据得多,修改数据得少。所以这个读写锁在这种场景下就很有用了!

读写锁有一个接口ReadWriteLock,定义的方法就两个:

我们还是来看看顶部注释说得啥吧:

其实大概也是说明了:在读的时候可以共享,在写的时候是互斥的

接下来我们还是来看看对应的实现类吧:

按照惯例也简单看看它的顶部注释:

于是我们可以总结出读写锁的一些要点了:

  • 读锁不支持条件对象,写锁支持条件对象
  • 读锁不能升级为写锁,写锁可以降级为读锁
  • 读写锁也有公平和非公平模式
  • 读锁支持多个读线程进入临界区,写锁是互斥的

2.1ReentrantReadWriteLock内部类

ReentrantReadWriteLock比ReentrantLock锁多了两个内部类(都是Lock实现)来维护读锁和写锁,但是主体还是使用Syn:

  • WriteLock
  • ReadLock

2.2读锁和写锁的状态表示

在ReentrantLock锁上使用的是state来表示同步状态(也可以表示重入的次数),而在ReentrantReadWriteLock是这样代表读写状态的:

2.3写锁的获取

主要还是调用syn的acquire(1):

进去看看实现:

2.4读锁获取

写锁的获取调用的是acquireShared(int arg)方法:

内部调用的是:doAcquireShared(arg);方法(实现也是在Syn的),我们来看看:

三、最后

这里就简单总结一下本文的内容吧:

  • AQS是*ReentrantReadWriteLock和ReentrantLock的基础*,因为默认的实现都是在内部类Syn中,而Syn是继承AQS的~
  • ReentrantReadWriteLock和ReentrantLock**都支持公平和非公平模式**,公平模式下会去看FIFO队列线程是否是在队头,而非公平模式下是没有的
  • ReentrantReadWriteLock是一个读写锁,如果读的线程比写的线程要多很多的话,那可以考虑使用它。它使用state的变量高16位是读锁,低16位是写锁
  • 写锁可以降级为读锁,读锁不能升级为写锁
  • 写锁是互斥的,读锁是共享的。

总的来说看多线程源码难度系数还是好高啊,我目前的水平只能过一过了….

多线程后面还有挺多高深的知识点:Future、同步容器啊、阻塞队列、各种原子类啊等等等,这里我打算就先放一放了,目前的水平有限啊~

后面可能会有一篇线程池的博文,敬请期待咯~

有兴趣的同学可继续往下面的参考资料下学习~~~

参考资料:

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y。为了大家方便,刚新建了一下qq群:742919422,大家也可以去交流交流。谢谢支持了!希望能多介绍给其他有需要的朋友

文章的目录导航:

数据标注的下一代SOP,可能不是Word,而是一段Prompt 再给几个反例:“这个只是正常纹理,不算。真正用于数据生产的Prompt,可能至少包含:任务定义、正例、反例、边界案例、优先级、输出格式、验收逻辑。一个项目100个人,如果100个人对这句话有100种理解,最后返工的就不是一个框,而可能是几十万帧数据。一个项目启动以后,项目经理先研究SOP,培训组长,组长再培训标注员,最后几百个人按照同一套规则干活。实际上一个成熟的项目经理,最重要的能力之一,就是:把客户的业务语言翻译成生产规则。真正让项目难交付的,从来不是80%的普通数据,而是那20%的长尾数据。 阅读详情

相关推荐

OrthoFinder功能、流程和文件注释

OrthoFinder 的标准输出包括:直系同源组,直系同源基因,有根基因树,解析基因树,无根物种树、有根物种树,基因重复事件以及相关的统计数据。

hs6605015的博客 3046

【并发编程】Lock锁及其常见子类

Lock锁及其常见子类LockReentrantLockReentrantReadWriteLock Lock // 获取锁 void lock(); // 释放锁 void unlock(); // 可以被中断的锁 void lockInterruptibly() throws InterruptedException; // 尝试获取锁并返回当前锁的获取情况。 boolean tryLock(); // 尝试获取一段时间的锁并返回当前锁的情况 boolean tryLock(long time, Ti

weixin_42598683的博客 576

publisher与subscriber话题的消息类型md5sum不一致问题

[ERROR] [1604235557.591296096]: Client [/range_vision_fusion_01] wants topic /detection/vision_objects to have datatype/md5sum [autoware_msgs/DetectedObjectArray/13415342e539aa36ea9a6f04ffaf39b4], but our version has [autoware_msgs/DetectedObjectArray/c16a

cxhmike的博客 6620

Java锁--Lock实现原理(底层实现)

关于java lock的底层实现原理,讲的有点深,转载学习!Lock完全用Java写成,在java这个层面是无关JVM实现的。在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQue

技术与生活齐头并进 3万+

SCS 43. 利用Scissor算法从单细胞数据中挖掘临床表型关联的细胞亚群

本文详细介绍了Scissor算法在单细胞转录组数据分析中的应用,该算法能够精准挖掘与临床表型关联的细胞亚群。通过建立单细胞RNA测序数据与临床预测模型的直接关联,Scissor避免了传统聚类方法的局限性,为疾病机制研究和个性化医疗提供了新工具。文章还涵盖了数据预处理、模型选择、结果验证等实战技巧。

weixin_28736335的博客 492

MineMap开发教程: 北斗网格位置码实时调度技术详解

本文介绍了MineMap4.0引擎中北斗网格位置码的实时调度技术。北斗网格位置码是我国自主研发的空间位置编码标准,具有层次化结构、三维编码等特点。MineMap4.0通过BeiDouGrid类实现了高效的实时调度机制,重点展示了按预想高度进行网格调度的核心功能。关键技术包括视锥体裁剪、LOD控制、高度筛选算法和交互式查询等。该技术在智慧城市、环境监测等领域具有广泛应用前景,凭借高性能、高精度等优势,为三维地理信息可视化提供了有力支撑。

weixin_42568040的博客 1443

Reentrantlock简介及使用例子(生产者消费者)

目录 一、基本使用方法 二、ReentrantLock类 三、其他注意 四、应用与实现(生产者消费者模式) 一、基本使用方法 ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式,以lock()为例,其使用方式为: ReentrantLock takeLock = new ReentrantLock(); // 获取锁 takeLock...

文艺范,晓清新 2004

【小程序】支付宝直付通解决方案

支付宝直付通是支付宝为小程序提供的一种支付解决方案,可以实现小程序中直接使用支付宝进行支付。以上是一个简单的支付宝直付通解决方案及相关代码示例。具体的使用还需要根据自己的业务需求进行定制化开发和调整。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1281

Lock

Lock接口方法相对于Synchronize,Lock在获取锁的操作上提供了阻塞、非阻塞可中断、超时设置等机制Lock使用方式  使用Lock需要显式的加锁和解锁 解锁操作需要放在finally块里,防止锁被超界获取 另外,获取锁的操作不能放在try块里,因为Lock是可重入锁,如果外层也已经调用lock()方法,而里层因为调用lock()抛出异常然后调用unlock,外层无法知晓,导致外层代码无法

技术流水 3912

深度解析:LPDDR5 Receiver 的挑战与应对

LPDDR5 的数据速率已经来到Tbit​DataRate1​≈156ps在6400Mbps时也就是说,。👉 这就是为什么成为 LPDDR5 的“标配”。

weixin_43199439的博客 211

Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(10) C++ 前置后置增减运算符重载形式与比较

C语言的++、–运算符在此不讨论。 文章目录1、前置后置增减运算符重载的形式2、前置和后置运算符的性能比较 1、前置后置增减运算符重载的形式 自增运算符“++”和自减运算符“–”分别包含两个版本。即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的。因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式。C++根据参数的个数来区分前置和后置形式。如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载

二进制君 5831

Android WebView内核更新机制与实战指南:从原理到应用场景

WebView作为Android系统中用于内嵌网页渲染的核心组件,其工作原理基于Chromium内核,负责解析HTML、CSS和JavaScript,实现原生应用与Web内容的无缝集成。在技术层面,WebView通过系统API提供网页渲染能力,其版本更新直接影响应用的兼容性、安全性和性能表现。随着移动应用对H5页面和混合开发模式的广泛采用,WebView的技术价值日益凸显,它成为连接原生功能与Web生态的关键桥梁。在实际应用场景中,开发者需要关注WebView内核的更新机制,特别是在国内复杂的Android

weixin_34268310的博客 289

游戏引擎揭秘:大厂为何死磕自研?

游戏引擎本质与商业价值解析 游戏引擎是集成了渲染、物理、动画等核心功能的开发工具包,其价值在于让开发者免于重复编写底层代码,专注于游戏内容创作。商业引擎(如Unity/Unreal)虽降低了开发门槛,但头部厂商仍坚持自研引擎,主要基于以下考量: 经济性:长期项目分摊自研成本后,比商业引擎分成更划算; 可控性:完全掌握底层代码,能针对性优化核心玩法需求; 技术壁垒:专属引擎成为厂商的竞争优势,如米哈游的跨平台渲染技术; 项目适配:超大型游戏(开放世界/MMO)需要深度定制解决方案。 这种"短期高投入

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 263

52 C++ unique_lock 替代 lock_guard 详解

返回它所管理的mutex对象指针,并释放所有权,也就是说:这个uique_lock 和mutex不在有关系,如果这时候mutex处理加锁状态,则要程序员自己对这个mutex进行unlock操作。我们会尝试用mutex的lock()去锁定这个mutex,但是如果没有锁定成功,我也会立即返回,并不会阻塞在这里。好处是不用管unlock(),在 sbguard1的析构函数调用的时候,会调用 mymutex1的析构函数。之前的lock_guard是要在析构函数调用的时候,才会调用 mutex.unlock();

hunandede的博客 1236

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Innodb 锁子系统

背景 锁 写在前面 本篇摘录自,数据库内核月报 - 2017 / 12《MySQL · 引擎特性 · Innodb 锁子系统浅析》 link record_lock_type 对于 LOCK_TABLE 类型来说都是空的,对于 LOCK_REC 目前值有: #define LOCK_WAIT 256 /* 表示正在等待锁 */ #define LOCK_ORDINARY 0 /* 表示 next-key lock ,锁住记录本身和记录之前的 gap*/ #define LOCK_GAP 512

一杯Mojito可以吗 318

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

锁子系统

基础 1:一些DB句柄是线程安全的,一些句柄在创建时可以提供一些flags来获得安全性 2:DB提供独占和非独占锁 3:Berkeley DB称线程安全叫Free-thread,也就是数据和对象不需要显式的加锁就能保证安全性 4:DB如果得不到锁就会被阻塞,DB提供了一些办法检测和化解死锁   线程安全的句柄 DbEvn 环境打开的时候使用DB_THREAD Db 打开数据库的

不积跬步 无以至千里 1002

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Synchronized,Lock底层解析

概述 在JDK1.5之前,使用synchronized来实现线程同步的,同步的开销较大效率较低,因此在JDK1.5之后,推出了代码层面的Lock接口(synchronized为jvm层面)来实现与synchronized同样功能的同步锁功能。 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock,其...

向着高亮的地方 426

使用LOCK

多个用户同时访问表时,必须加LOCK。 一个reader必须阻塞writers,不用阻塞readers。但是一个writer必须住的是reader和writer 1.不用明确的指定锁 2.如果不明确的锁对于客户端是不明确的,它能偶明确的使用LOCK TABLES释放他们使用UNLOCK TABLES。 另外的一种类型的锁是合作锁,建议锁并不锁定任何数据他们和其他的用户合作完成。    1

CodeMyDream的专栏 1024

Lock锁以及线程

Lock(接口): void lock() 获得锁,加锁 void unlock() 释放锁 子类: ReentrantLock 这是解决线程同步安全的第二种方式 class SellTick1 implements Runnable{ //定义票的个数 private int tickets = 100; //定义锁对象 private Lock lock = new ReentrantLock(); @Override public void ru

qq_44872329的博客 326

MySQL · 引擎特性 · Innodb 锁子系统浅析

锁类型 Innodb 的锁从锁粒度上大致可以分为行锁和表锁,之前接触过的Berkeley DB(MySQL 5.1前的事务储存引擎,后被 Innodb 取代)只对存储格式为 Hash 的定长数据支持行锁,对于 Btree 格式的仅支持页锁,作为 KV 类型的存储引擎,锁的类型也相对简单。Innodb 根据官方文档的描述,除了基本的共享锁和排他锁,还有意向...

weixin_33709590的博客 207

ReentrantLock实现机制

上述的功能大多是借助AQS的已有代码,以及ReentrantLock内部类像FairSync等继承了AQS并且实现了对应的钩子方法例如tryAcquire来实现总体的功能。首先入口是RL的lock方法,而底层其实是调用内部变量Sync的acquire方法(也就是AQS的acquire模板方法)本方法的实现是为了给AQS实现对应的钩子方法,在RL的unlock方法最终会调用AQS的release。首先ReentrantLock实现了对应的Lock接口,他的功能基本上起到的就是本地锁的作用,

weixin_55010563的博客 436

mysql innodb锁机制_MySQL · 引擎特性 · Innodb 锁子系统浅析

锁类型Innodb 的锁从锁粒度上大致可以分为行锁和表锁,之前接触过的Berkeley DB(MySQL 5.1前的事务储存引擎,后被 Innodb 取代)只对存储格式为 Hash 的定长数据支持行锁,对于 Btree 格式的仅支持页锁,作为 KV 类型的存储引擎,锁的类型也相对简单。Innodb 根据官方文档的描述,除了基本的共享锁和排他锁,还有意向锁,Gap锁,Next key锁等类型,最开始...

weixin_31459297的博客 320

educoder 使用线程锁(lock)实现线程同步_新手入门必看-线程同步锁-Lock锁

本文主要内容:线程同步的概念和使用场景使用同步代码块使用同步方法使用lock锁三种方式实现窗口售票本文作业1 问题的提出• 应用场景:• 多个用户同时操作一个银行账户。每次取款400元,取款前先检查余额是否足够。如果不够,放弃取款• 分析• 使用多线程解决• 开发一个取款线程类,每个用户对应一个线程对象• 因为多个线程共享同一个银行账户,使用Runnable方式解决• 思路• 创建银行账户类Ac...

weixin_39621044的博客 195
上一篇: AQS简简单单过一遍
下一篇: Object对象你真理解了吗?
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值