JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • sourcecode
  • jdk
JavaInterview.cn
2022-04-21
目录

java.util.concurrent.locks.AbstractQueuedSynchronizerJava

文章发布较早,内容可能过时,阅读注意甄别。

# 成员变量

  1. private volatile int state;同步状态字段
  2. 设置支持compareAndSet
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long stateOffset;
    private static final long headOffset;
    private static final long tailOffset;
    private static final long waitStatusOffset;
    private static final long nextOffset;

    static {
        try {
            stateOffset = unsafe.objectFieldOffset
                (AbstractQueuedSynchronizer.class.getDeclaredField("state"));
            headOffset = unsafe.objectFieldOffset
                (AbstractQueuedSynchronizer.class.getDeclaredField("head"));
            tailOffset = unsafe.objectFieldOffset
                (AbstractQueuedSynchronizer.class.getDeclaredField("tail"));
            waitStatusOffset = unsafe.objectFieldOffset
                (Node.class.getDeclaredField("waitStatus"));
            nextOffset = unsafe.objectFieldOffset
                (Node.class.getDeclaredField("next"));

        } catch (Exception ex) { throw new Error(ex); }
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 成员函数

  1. 通过LockSupport.unpark(s.thread);解锁,通过LockSupport.park(s.thread);加锁
  2. tryAcquire和tryRelease是获取和释放非公平锁,tryAcquireShare和tryReleaseShare是获取和释放公平锁
  3. addWaiter(Node mode)往队列里添加节点,

# 内部类

  1. public class ConditionObject implements Condition, java.io.Serializable条件对象里有 await()方法做阻塞,signal()方法做唤醒,主体是对
        /** First node of condition queue. */
        private transient Node firstWaiter;
        /** Last node of condition queue. */
        private transient Node lastWaiter;

1
2
3
4
5

头节点和尾节点操作

2.static final class Node阻塞队列里的节点Node,阻塞队列名叫CLH,Node类里的成员变量

   static final class Node {
       /** Marker to indicate a node is waiting in shared mode */
       static final Node SHARED = new Node();
       /** Marker to indicate a node is waiting in exclusive mode */
       static final Node EXCLUSIVE = null;

       /** waitStatus value to indicate thread has cancelled */
       static final int CANCELLED =  1;
       /** waitStatus value to indicate successor's thread needs unparking */
       static final int SIGNAL    = -1;
       /** waitStatus value to indicate thread is waiting on condition */
       static final int CONDITION = -2;
       /**
        * waitStatus value to indicate the next acquireShared should
        * unconditionally propagate
        */
       static final int PROPAGATE = -3;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

还有一些Node prev、Node next节点变量,predecessor()方法等,都是对Node的操作。

微信 支付宝
#Java
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式