JUC-locks锁

JUC-locks锁

  • 1、JUC-locks锁概述
  • 2、管程模型
  • 3、ReentrantLock可重入锁
    • 3.1 ReentrantLock源码
    • 3.2 Sync静态内部类
    • 3.3 NonfairSync非公平锁
    • 3.4 FairSync公平锁

如有侵权,请联系~
如有错误,也欢迎批评指正~

1、JUC-locks锁概述

java的并发包【JUC】下面就两个子包,一个是atomic原子包,另一个就是lock锁包。这个包下就提供了三种锁:ReentrantLock【可重入锁】、ReentrantReadWriteLock【可重入读写锁】、StampedLock【更轻量级的读写锁】。
这些锁的实现大部分都是基于AbstractQueuedSynchronizer【俗称的AQS,分两篇文章,防止难以消化】类实现的。

2、管程模型

管程模型是并发编程的万能钥匙,juc包下的锁以及阻塞队列几乎都是使用的管程模型实现的。当然管程模型【java选择】和信号量是【操作系统】等价的,这两个都是用来解决并发问题,以使用信号量实现管程,也可以使用管程实现信号量。
管程就是指管理共享变量,以及对共享变量的相关操作,对应于java中类的属性和方法。管程主要是三种模型:Hasen 模型、Hoare 模型和 MESA 模型,Java 使用的是 MESA 模型。
管程特点:

  • 封装性:管程将共享资源和操作这些资源的同步机制进行封装,共享变量只能被管程中的方法访问,外部过程不能访问。
  • 互斥访问:管程确保每次只有一个线程能够执行管程中的代码。当一个线程在管程中执行时,其他试图进入该管程的线程被阻塞,直到当前线程退出管程。
  • 条件变量:管程通常可以有一个或多个条件变量,用于线程间的条件同步。线程可以在管程内部等待某个条件成立(通过调用某个等待函数),同时释放锁,直到条件满足时得到通知。

管程模型的整体架构图:
在这里插入图片描述

3、ReentrantLock可重入锁

ReentrantLock可重入锁支持公平锁也支持非公平锁(具体实现可以查看各自的tryAcquire()方法),选择公平锁还是非公平锁根据创建该对象时候的参数。

ReentrantLock类内部有三个静态内部类Sync(NonfairSync和FairSync的基类)、NonfairSync(非公平锁)、FairSync(公平锁)
在看源码之前,看一下整体的架构图【根据上面的管程模型进行改动】:
在这里插入图片描述

3.1 ReentrantLock源码

public class ReentrantLock implements Lock, java.io.Serializable {private final Sync sync;// 在创建ReentrantLock对象的时候就指定是使用公平锁还是非公平锁。无参构造默认使用非公平锁。public ReentrantLock() {sync = new NonfairSync();}public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();}// 调用内部静态类,根据参数是公平锁还是非公平锁public void lock() {sync.lock();}// 不管这个锁是公平的还是非公平的,都是按照非公平锁的方式获取资源方法public boolean tryLock() {return sync.nonfairTryAcquire(1);}// 调用AQS类的tryAcquireNanos,如果等待时间比较久超过1000ns,就会让该线程进行阻塞。// 这个会根据锁是公平锁还是非公平锁来获取资源,不同于tryLock()public boolean tryLock(long timeout, TimeUnit unit)throws InterruptedException {return sync.tryAcquireNanos(1, unit.toNanos(timeout));}public void unlock() {sync.release(1);}
}

3.2 Sync静态内部类

abstract static class Sync extends AbstractQueuedSynchronizer {// 抽象方法,等待实现类NonfairSync和FairSync实现。该方法被ReentrantLock.Lock()调用abstract void lock();// 非公平锁获取资源。直接就获取资源,只看是不是有资源(资源被其他线程占用)final boolean nonfairTryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0) {// 如果资源没线程占用,则cas直接占用,占用成功直接返回,设置占用资源的线程为当前线程if (compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}}else if (current == getExclusiveOwnerThread()) {// 如果当前资源被占用,但是是被自己占用的,则可以继续占用【可重入】int nextc = c + acquires;if (nextc < 0) // overflowthrow new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;}// 这个方法其实是AQS中的方法,lock.unlock()就会调用这个方法public final boolean release(int arg) {if (tryRelease(arg)) {Node h = head;if (h != null && h.waitStatus != 0)unparkSuccessor(h);  // 释放完资源唤醒队列线程return true;}return false;}// 释放资源,释放资源不需要循环,只有获取资源才会竞争才需要CAS+自旋。释放不需要竞争protected final boolean tryRelease(int releases) {int c = getState() - releases;if (Thread.currentThread() != getExclusiveOwnerThread())// 释放资源,前提肯定是当前线程占用资源。如果资源没被当前线程占用,当前线程释放肯定有问题throw new IllegalMonitorStateException();boolean free = false;if (c == 0) {free = true;setExclusiveOwnerThread(null);  // 如果释放所有资源,把owner线程释放}setState(c);return free;}}

3.3 NonfairSync非公平锁

一句话概述:当一个线程想要获取资源的时候,先争取去获取资源state,如果没竞争到再老老实实去阻塞队列中排队。
那为什么阻塞队列中有等待线程,state资源还可能为空呢?
有可能上一个线程刚释放,阻塞线程还没来的急抢占。

static final class NonfairSync extends Sync {// 非公平锁在放入队列之前先判断是否可以获取到锁,如果能够获取到直接使用,否则加入阻塞队列final void lock() {if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);  }protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);}
}

3.4 FairSync公平锁

一句话概述:当前线程获取锁资源的时候,抢占资源的条件是阻塞队列中没有等待线程。

static final class FairSync extends Sync {// 直接加入阻塞队列final void lock() {acquire(1);}// 公平锁在获取资源的时候会先判断当前线程在队列中是否还存在前面的节点,即只有当前节点为第一个节点的时候才可以获取资源protected final boolean tryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0) {// 这里就体现了如果阻塞队列中有等待线程,即使当前资源空闲,也需要乖乖去排队。if (!hasQueuedPredecessors() &&compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}}else if (current == getExclusiveOwnerThread()) {int nextc = c + acquires;if (nextc < 0)throw new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;}
}

通过上述发现公平锁和非公平锁最大的区别就是:

  • 不同点:公平锁即使当前资源空闲,只要阻塞队列中有线程等待就会乖乖去排队,而非公平锁则是只要资源闲着就去抢一下,抢不到再老老实实去阻塞队列排队。【公平锁像是一个懂得克制的乖孩子,非公平锁则是调皮捣蛋的小孩子,不管行不行,先抢他一下试试】
  • 相同点:
    • 非公平锁抢了一下没获取到资源,也需要去排队,只给你一次机会。
    • 公平锁和非公平锁调用tryLock()都是非公平锁实现,直接看资源能不能获取到。

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

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

相关文章

如何将交叉编译配置在环境变量中

-- 将交叉编译配置到环境变量中&#xff0c;就可以直接用了 -- 环境变量 PATH -- 修改 Linux 的环境变量需要哪个文件 针对本用户修改&#xff1a; ~/.bashrc针对所有用户修改&#xff1a; /etc/profile -- 这里针对所有用户修改 sudo gedit /etc/profile-- 注意这个文件…

LeetCode-222.完全二叉树的节点个数

. - 力扣&#xff08;LeetCode&#xff09; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一…

Jmeter中的配置原件(五)

17--登录配置原件/素 用途 管理登录信息&#xff1a;为测试计划中的多个请求提供统一的登录信息。简化配置&#xff1a;避免在每个请求中重复配置用户名和密码。支持多种认证方式&#xff1a;支持Basic、Digest等认证方式。 配置步骤 添加登录配置元件 右键点击线程组&#…

深度解析 ArrayList:揭开源码背后的设计与实现原理

一、ArrayList 简介 ArrayList 的底层是数组队列&#xff0c;相当于动态数组。与 Java 中的数组相比&#xff0c;它的容量能动态增长。在添加大量元素前&#xff0c;应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 ArrayLi…

网络安全应该学什么?别被培训机构这些内容给骗了!

了解过的朋友都知道&#xff0c;网络安全内容十分丰富&#xff0c;大大小小的知识点都包含。所以有的朋友就都想学&#xff0c;尤其一些培训机构的课程大纲介绍的特别详细&#xff0c;又包含这又包含那&#xff0c;但是这些内容真的都实用吗&#xff1f;如果想系统学习&#xf…

吴恩达LLM Agent工作流Prompt设计精解

在详解和实测吴恩达4种Agentic 工作流之中&#xff0c;我测试了各种框架诸如反思、工具调用、规划、多智能体&#xff0c;在学习了其中各种Prompt设计后&#xff0c;有了一些新的认识。 对于特定的任务来说&#xff0c;没有万能的Prompt&#xff0c;只有一些通用的模式&#xf…

除了 Mock.js,前端还有更方便的 Mock 数据工具吗?

在前端开发中&#xff0c;模拟数据&#xff08;Mock Data&#xff09;是不可或缺的一部分&#xff0c;它能够帮助开发者在后端接口未完成前进行界面和逻辑的测试。而 Mock.js 是一个广泛使用的库&#xff0c;它通过简洁的语法和强大的功能&#xff0c;让前端开发者可以轻松地创…

【原创】java+ssm+mysql高校学籍管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

pytorch深度学习环境安装 + 讲解【新手版】

不知道有没有学深度学习的小伙伴在安装深度学习环境时候很头疼&#xff0c;反正我在研一时候是很头疼很头疼的一件事&#xff0c;根本搞不清楚什么显卡、显卡驱动、pytorch版本、cuda、cudnn等等等&#xff0c;这些是不是非常的头疼。 好&#xff0c;你们的救星来了。我&#x…

zabbix搭建钉钉告警流程

目录 zabbix实验规划 zabbix实验步骤 1 使用钉钉添加一个自定义的机器人 ​编辑2在zabbix-server上编写钉钉信息发送脚本&#xff0c;设置钉钉报警媒介 设置钉钉报警媒介​编辑​编辑 在添加消息模板​编辑​编辑​编辑 3设置动作条件 触发后的行为&#xff1a;重新添加一…

无人机飞手考证,地面站培训技术详解

无人机飞手考证及地面站培训技术涉及多个关键方面&#xff0c;以下是对这些方面的详细解析&#xff1a; 一、无人机飞手考证流程与要求 1. 证书类型 民用无人机驾驶员证书&#xff1a;这是国家民航局颁发的无人机操作人员资质证书&#xff0c;分为视距内驾驶员、超视距驾驶员…

高颜值的卡片折叠效果(附源码)

预览效果 源码(html部分) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>17sucai -Holiday Feature Folding Cards [Pure CSS]</title><meta charset"UTF-8"><meta name&qu…

Mybatis的执行流程解析

根据图中步骤&#xff0c;我们可以将这个执行流程分成了8个步骤。 1、读取MyBatis的核心配置文件。mybatis-config.xml为MyBatis的全局配置文件&#xff0c;用于配置数据库连接、属性、类型别名、类型处理器、插件、环境配置、映射器&#xff08;mapper.xml&#xff09;等信息…

24年下软考系统架构设计师真题及答案,估分、备考速看!

2024下半年软考考试已经圆满结束了&#xff0c;为大家整理了网友回忆版的软考高级系统架构设计师真题真题及答案。下半年考试的宝子们可以对答案预估分数&#xff01;准备明年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考点的题目&#xff01; 一、…

手把手教你用Coze零代码搭建一个智能搜索智能体,高时效性、保姆级!

随着大模型技术的发展&#xff0c;越来越多的技术开始涌现&#xff0c;从聊天助手&#xff0c;到智能体&#xff0c;再到工作流&#xff0c;最后到三者的整合。大模型技术朝着更加智能化、通用化、个性化的方向发展&#xff0c;为人们的生活和工作带来了更多的便利和创新。 今…

HTML之列表学习记录

练习题&#xff1a; 图所示为一个问卷调查网页&#xff0c;请制作出来。要求&#xff1a;大标题用h1标签&#xff1b;小题目用h3标签&#xff1b;前两个问题使用有序列表&#xff1b;最后一个问题使用无序列表。 代码&#xff1a; <!DOCTYPE html> <html> <he…

数据结构Python版

2.3.3 双链表 双链表和链表一样&#xff0c;只不过每个节点有两个链接——一个指向后一个节点&#xff0c;一个指向前一个节点。此外&#xff0c;除了第一个节点&#xff0c;双链表还需要记录最后一个节点。 每个结点为DLinkNode类对象&#xff0c;包括存储元素的列表data、…

Linux手动安装nginx

本次以安装nginx-1.12.2为例 1、首先说明一下,安装nginx之前需要安装如下素材: 2、开始安装 第一步,安装依赖yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel第二步,下载并安装nginx安装包(nginx官网:http://nginx.org/)# 下载 wget http://nginx…

无线感知会议系列【14】SignFi: Sign Language Recognition Using WiFi

摘要&#xff1a; 这篇Paper 是用CNN 做的,用来做手语识别的 模型输入&#xff1a; csi_tensor [M,N,S,T] M: tx 发送天线数量 N: rx 天线数量 S: 幅度和相位信息 T: CSI matrix for each instance 数据集大小 模型结构,跟斯坦福的HAR LSTM 有较大差异[batch_size, time, carr…

详解AI产品经理的发展与规划(附完整PPT)

随着AI技术的逐渐普及与落地&#xff0c;AI产品经理在市场上也变得分外火热。那么在未来&#xff0c;这个职业将如何发展&#xff0c;它的工作要素有哪些&#xff0c;要怎么做才能成为一名AI产品经理呢&#xff1f; 大家好&#xff0c;近日分享一些关于AI产品经理的话题。这个…