首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 并发(3)AbstractQueuedSynchronizer 源码分析之共享模式

通过上一篇《Java 并发(2)AbstractQueuedSynchronizer 源码分析之独占模式》的分析,我们知道了独占模式获取锁有三种方式,分别是不响应线程中断获取,响应线程中断获取,设置超时时间获取...虽然说 AbstractQueuedSynchronizer 源码有一千多行,但是重复的也比较多,所以读者不要刚开始的时候被吓到,只要耐着性子去看慢慢的自然能够渐渐领悟。...就我个人经验来说,阅读 AbstractQueuedSynchronizer 源码有几个比较关键的地方需要弄明白,分别是独占模式和共享模式的区别,结点的等待状态,以及对条件队列的理解。...理解了这些要点那么后续源码的阅读将会轻松很多。 当然这些在《Java 并发(1)AbstractQueuedSynchronizer 源码分析之概要分析》这篇文章里都有详细的介绍,读者可以先去查阅。...本篇对于共享模式的分析也是分为三种获取锁的方式和一种释放锁的方式。

55030
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java并发-JUC-AQS-共享模式源码解析

    文章目录 说明 疑问 为什么需要实现两种不同模式 什么是共享模式 概述 源码分析 总结 说明 每个 Java 工程师都应该或多或少地了解 AQS,我已经反复研究了很长时间,忘记了一遍又一遍地看它.每次我都有不同的经历...源码分析 基于上面提到的获取和释放排他锁的一般过程,让我们来看看源代码实现逻辑.首先,让我们看看获取锁的acquireShared()方法。...最后,如果返回值大于0,则表示当前线程成功获取共享锁,其等待的节点可以继续成功获取共享锁,即需要唤醒后续节点尝试获取共享锁。...此时,它需要唤醒它后面的共享节点(如果有的话)。但是,当共享锁通过releasshared()方法释放时,可以唤醒等待排他锁和共享锁的线程来尝试获取它。...总结 与排他锁相比,共享锁的主要特点是当等待队列中的共享节点成功获得锁(即获得共享锁)时,由于它是共享的,所以必须依次唤醒所有可以与其共享当前锁资源的节点.毫无疑问,这些节点也一定在等待共享锁(这是前提

    22410

    AbstractQueuedSynchronizer 源码分析(共享锁)

    源码看之前的问题 race condition如何避免? 工作流程是怎么样的? 使用什么方式实现的?...AbstractQueuedSynchronizer 源码解析 ps:condition相关的先不涉及,单纯的看lock相关源码 ps2:单独看AQS很抽象,我们结合具体类来了解相关功能 ps3:要用多线程的思维去看...,单线程思维看这个根本就看不明白 重要的属性字段 state 标识当前锁的状态,源码实现中一般标识锁数量,像在CountDownLatch中state标识latch的count,每当有线程countDown...表示后继节点需要被唤醒 -2 CONDITION 表示线程在等待condition -3 PROPAGATE 表示下一次acquireShared应该被无条件传播 mode: 值 说明 SHARED 共享模式...EXCLUSIVE 独占模式 CountDownLatch 对AQS的使用 我们从最简单的CountDownLatch来看一下AQS的共享模式的使用 demo以及CountDownLatch相关API

    62140

    Java并发:深入浅出AQS之共享锁模式源码分析

    二、源码深入分析 基于上面所说的共享锁执行流程,我们接下来看下源码实现逻辑: 此方法是共享模式下线程获取共享资源的顶层入口。...4、如果返回值大于0,表示当前线程获取共享锁成功且它后续等待的节点也有可能继续获取共享锁成功,也就是说此时需要把后续节点唤醒让它们去尝试获取共享锁。...满足释放锁的条件为:允许传播或者需要通知继任节点,或者继任节点是共享模式的节点 以下源码分析 final Node node = addWaiter(Node.SHARED); shouldParkAfterFailedAcquire...(p, node) parkAndCheckInterrupt() cancelAcquire(node); 参考我的上篇文章 Java并发:深入浅出AQS之独占锁模式源码分析 独占锁模式获取成功以后设置头结点然后返回中断状态...三、总结 跟独占锁相比,共享锁的主要特征在于当一个在等待队列中的共享节点成功获取到锁以后(它获取到的是共享锁),既然是共享,那它必须要依次唤醒后面所有可以跟它一起共享当前锁资源的节点,毫无疑问,这些节点必须也是在等待共享

    84610

    Java中的屏幕共享

    了解如何使用 Java、Node.js 和 JxBrowser 构建屏幕共享应用程序。远程屏幕共享用于各种应用程序和服务,从网络会议到远程访问应用程序。...但是,如果你需要在 Java 应用程序中拥有远程访问功能怎么办?在本文中,将展示一种方法,该方法允许使用JxBrowser的功能在不同 PC 上运行的两个 Java 应用程序之间实现屏幕共享。...为了在 Java 中实现屏幕共享,将利用 Chromium 支持即时使用的屏幕共享和 JxBrowser 提供对它的编程访问这一功能。...Java 客户端是两个桌面应用程序。第一个是带有按钮的窗口。单击该按钮开始共享会话。第二个应用程序自动接收视频流并显示它。还有一个停止屏幕共享的按钮。...借助 JxBrowser 提供的捕获 API,丰富了标准 Java 应用程序的屏幕共享功能。

    1.9K20

    Postgresql源码(90)共享内存申请CreateSharedMemoryAndSemaphores

    Postgresql启动后申请两段内存,在启动时会判断系统支持情况,默认是使用mmap申请共享内存。...《Linux内存映射函数mmap与匿名内存块》 ipc的共享内存,只申请PGSharedMemoryCreate大小。...《Linux共享内存与子进程继承》 Postgresql的共享内存在9.2以后就是使用mmap申请的了,在少数情况下使用ipc的共享内存。...IPC的共享内存: 在当前例子中,IPC的共享内存只申请了一个PGShmemHeader的空间,没有其他空间可以使用。...在这个步骤前,直接使用ShmemAlloc申请共享内存,调整freeoffset位置 在这个步骤后,使用ShmemInitStruct申请共享内存,先在哈希表中创建一个索引条目,在使用ShmemAlloc

    73420

    ReentrantReadWriteLock 源码分析以及 AQS 共享锁 (二)

    前言 上一篇讲解了 AQS 的独占锁部分(参看:ReentrantLock 源码分析以及 AQS (一)),这一篇将介绍 AQS 的共享锁,以及基于共享锁实现读写锁分离的 ReentrantReadWriteLock...实现读读共享、读写互斥,写写互斥。这也是 ReentrantReadWriteLock 读写分离锁的由来。它非常适合用在读多写少的场景。...public static class ReadLock implements Lock, java.io.Serializable { private static final long serialVersionUID...ReentrantReadWriteLock lock) { sync = lock.sync; } ... } public static class WriteLock implements Lock, java.io.Serializable...读锁,就比较复杂了,因为高16位只能表示持有共享锁的线程个数,实在是分身乏术啊。

    40810

    Java Review - 并发编程_伪共享

    文章目录 what's 伪共享 为何会出现伪共享 如何避免伪共享 小结 what’s 伪共享 为了解决计算机系统中主内存与CPU之间运行速度差问题,会在CPU与主内存之间添加一级或者多级高速缓冲存储器(...为何会出现伪共享共享的产生是因为多个变量被放入了一个缓存行中,并且多个线程同时去写入缓存行中不同的变量。 那么为何多个变量会被放入一个缓存行呢?...JDK 8提供了一个sun.misc.Contended注解,用来解决伪共享问题。将上面代码修改为如下。...在默认情况下,@Contended注解只用于Java核心类,比如rt包下的类。如果用户类路径下的类需要使用这个注解,则需要添加JVM参数:-XX:-RestrictContended。...小结 我们这里主要讲述了伪共享是如何产生的,以及如何避免,并证明在多线程下访问同一个缓存行的多个变量时才会出现伪共享,在单线程下访问一个缓存行里面的多个变量反而会对程序运行起到加速作用。

    32620

    AQS源码剖析第三篇--共享模式

    AQS源码剖析第三篇--共享模 CountDownLatch 源码分析 await源码分析 countDown源码分析 CyclicBarrier 源码分析 Semaphore 参考 ---- 系列文章...: AQS源码剖析第一篇—全貌概览 AQS源码剖析第二篇–公平与非公平,条件队列和线程中断 ---- 这篇,我们的关注点是 AQS 最后的部分,AQS 共享模式的使用。...本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier、Semaphore 的源码一起过一下。...package com.aqs; import java.util.concurrent.CountDownLatch; /** * @author 大忽悠 * @create 2022/10/...首先,CyclicBarrier 的源码实现和 CountDownLatch 大相径庭,CountDownLatch 基于 AQS 的共享模式的使用,而 CyclicBarrier 基于 Condition

    30420

    java基础多线程之共享数据

    java基础巩固笔记5-多线程之共享数据 线程范围内共享数据 ThreadLocal类 多线程访问共享数据 几种方式 本文主要总结线程共享数据的相关知识,主要包括两方面:一是某个线程内如何共享数据...,保证各个线程的数据不交叉;一是多个线程间如何共享数据,保证数据的一致性。...例子 package com.iot.thread; import java.util.HashMap; import java.util.Map; import java.util.Random...$1.run(ThreadScopeShareData.java:21)     at java.lang.Thread.run(Thread.java:745) 具体原因还不知道 ThreadLocal...[本质:共享数据的对象作为参数传入Runnable对象] 线程执行代码不同,将Runnable对象作为某一个类的内部类,共享数据作为这个外部类的成员变量(操作数据的方法放在外部类)。

    1.6K70

    Java扩展Nginx之七:共享内存

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 作为《Java扩展Nginx》系列的第七篇...:在使用nginx-clojure进行java开发时,用共享内存在多个worker之间同步数据 本文由以下内容组成: 先在java内存中保存计数,放在多worker环境中运行,验证计数不准的问题确实存在...带着这个疑问,去看NginxSharedHashMap的源码,如下图,真相大白:get、put这些常用方法,都被重写了,红框中的nget和nputNumber都是native方法,都是在操作共享内存:...至此,nginx-clojure的共享内存学习完成,高并发场景下跨进程同步数据又多了个轻量级方案,至于用它还是用redis,相信聪明的您心中已有定论 源码下载 《Java扩展Nginx》的完整源码可在...,https协议 git仓库地址(ssh) git@github.com:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议 这个git项目中有多个文件夹,本篇的源码在nginx-clojure-tutorials

    86440
    领券