zoukankan      html  css  js  c++  java
  • AQS源码阅读笔记(一)

    AQS源码阅读笔记

    先看下这个类张非常重要的一个静态内部类Node。如下:

      

    static final class Node {
        //表示当前节点以共享模式等待锁
        static final Node SHARED = new Node();
              //表示当前模式以独占模式等待锁
        static final Node EXCLUSIVE = null;
        
        //表示当前线程等待锁的动作被取消了(那么当前节点将会在下一次迭代节点的时候被踢出)
        static final int CANCELLED =  1;
        //表示当前节点处于挂起状态,如果当前节点的前一个节点释放了锁,那么当前节点将会被唤醒
        static final int SIGNAL    = -1;
        //(此处先不分析,后续在分析COnfition的时候再分析)
        static final int CONDITION = -2;
         //此处我们先不分析,后续在分析释放锁的时候分析
        static final int PROPAGATE = -3;    
         //当前节点的状态
         volatile int waitStatus;
    
        //指向当前节点前一个节点的引用
    	volatile Node prev;
        //指向当前节点后一个节点的引用  
            volatile Node next;
        //当前节点持有的线程
            volatile Thread thread;
        //当前节点以何种方式等待锁(它的取值,要么是SHARE,要么是EXCLUSIVE)
            Node nextWaiter;
        //当前线程是否以共享模式等待锁
            final boolean isShared() {
                return nextWaiter == SHARED;
            }
        //查找当前节点的前一个节点
            final Node predecessor() throws NullPointerException {
                Node p = prev;
                if (p == null)
                    throw new NullPointerException();
                else
                    return p;
            }
    
            Node() {    // Used to establish initial head or SHARED marker
            }
    
            Node(Thread thread, Node mode) {     // Used by addWaiter
                this.nextWaiter = mode;
                this.thread = thread;
            }
    
            Node(Thread thread, int waitStatus) { // Used by Condition
                this.waitStatus = waitStatus;
                this.thread = thread;
            }
        }    
    

      

      接着,我们再来看看AQS中的字段:

    	private transient volatile Node head;
    
      
            private transient volatile Node tail;
    
      
            private volatile int state;
    

      其中, node和tail分别表示头结点和尾节点,这两个字段是用来的保证同步队列原子入(出)队操作(具体后续在分析具体的实现类中说)。

      state在此处可以简单理解为加锁的次数(每次加锁,state + 1,每次释放锁, state - 1,当state = 0的时候,就表示没有线程持有锁 )。

    后续结合具体的实现类来分析各种加锁,解锁。

    
    

        

  • 相关阅读:
    Linux kernel 之 uart 驱动解析
    按键驱动程序(异步通知)
    常用Linux运维命令
    进程上下文、中断上下文及原子上下文
    Linux 设备驱动开发 —— platform设备驱动应用实例解析
    C++中rapidxml用法及例子(源码)
    hpp.h与.h的区别
    使用Visual Studio扩展插件Visual assist X给代码插入注释模板
    VC++ MFC SDI/MDI Ribbon程序的停靠窗格被关闭后如何再次显示
    “ping某个IP地址,如果ping不通则在dos窗口或弹出MsgBox提示原因”的批处理bat命令
  • 原文地址:https://www.cnblogs.com/bedlimate/p/8810893.html
Copyright © 2011-2022 走看看