美文网首页
AQS Something

AQS Something

作者: NazgulSun | 来源:发表于2021-06-24 14:50 被阅读0次

AQS:

java 锁的核心抽象类:

主要的思想,就是 violate 的 state + cas 来模拟,加锁 和解锁的操作;
waiting 的列表,使用的是一个 线程队列。

不同于 synchronizer 用的是 moniter enter/exit 特殊指令; 加 mointer对象(也包含,等待队列,当前线程等;)
每次进入moniter标识的区间,就会检查响应对象的monitor对象,当前线程,重入次数;等待队列等等;

======================
AQS 的思想,可以锁基本和 moniter是一样的。 等待列表, 计数state,当前线程。

其中 state 的取值范围是 0/1,代表独占锁,取大于0的值的时候,代表的是共享锁;

其中等待队列,用来处理 公平和非公平的问题;

=======AQS 有5个抽象方法,是需要更具自己的需求去实现的。
tryAcquire
tryRelease
tryAcquireShared
tryReleaseShared
isHeldExclusively

以可重入lock为例:

        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;
        }

就是在实现 tryAcquire;
cas 设置状态:如果 state >0, 但是当前线程是持有锁的线程,就计数增加;

==== 在看额countlatch,是一个典型的 shared 锁的 机制:

       protected int tryAcquireShared(int acquires) {
            return (getState() == 0) ? 1 : -1;
        }

        protected boolean tryReleaseShared(int releases) {
            // Decrement count; signal when transition to zero
            for (;;) {
                int c = getState();
                if (c == 0)
                    return false;
                int nextc = c-1;
                if (compareAndSetState(c, nextc))
                    return nextc == 0;
            }
        }

countLatch, 初始化的时候,就把 state 设置为 比如10;
countLatch. await() 的就是尝试获得锁; 但是 state!=0,肯定是获得不到的。所以等待;
countLatch.release,就是减少state,以便 await的线程能够获得锁;

其他的semphare ,用state来作为permit,permit 为0 的时候无法获取需要wait,不为0 可以获取;

cyclebarrier 使用的是条件condition,一个lock 可以有多个condition,我们可以做到更加灵活的singal 对应的线程; 同样适用一个变量,记录barrier的个数,当达到0的时候,signalall, 通知所有的线程,同时 reseet 变量,可以重复使用,这是和 countlatch不一样的地方;

相关文章

  • AQS Something

    AQS: java 锁的核心抽象类: 主要的思想,就是 violate 的 state + cas 来模拟,加锁 ...

  • Java并发编程——AQS源码解析

    Java并发编程——AQS源码解析 什么是AQS AQS有什么用 AQS实现方式 一、AQS是什么? AQS是一个...

  • J.U.C之AQS:大话AQS详解和使用

    J.U.C之AQS:AQS详解和使用 AQS是什么 AQS是AbstractQueuedSynchronizer的...

  • 知识梳理目录

    Java基础 Java线程池 AQS之独占锁 AQS之Condition AQS之Condition AQS之同步...

  • JUC原理之AQS

    AQS AQS即AbstractQueuedSynchronizer(抽象队列同步器)。AQS是Reentrant...

  • 7、AQS(AbstractQueuedSynchronizer

    1.AQS简介 1.1 AQS解释及特点 所谓AQS,指的是AbstractQueuedSynchronizer,...

  • 死磕 java同步系列之AQS起篇

    问题 (1)AQS是什么? (2)AQS的定位? (3)AQS的实现原理? (4)基于AQS实现自己的锁? 简介 ...

  • Java中的AQS

    AQS是什么? AQS全称是AbstractQueuedSynchronizer。 AQS是实现显示锁,Count...

  • AbstractQueuedSynchronizer源码解析

    AQS是什么? AQS是什么,相信大家都不陌生这个题目,那么AQS到底是什么呢? AQS的全称是 Abstract...

  • AQS详解

    AQS详解:AQS原理AQS:AbstractQuenedSynchronizer抽象的队列式同步器。是除了jav...

网友评论

      本文标题:AQS Something

      本文链接:https://www.haomeiwen.com/subject/vkowyltx.html