zoukankan      html  css  js  c++  java
  • ReentrantLock 解读

    ReentrantLock  非公平锁

    lock:
        如果stage==0 或 线程为当前线程 则 设置state=state+1 ,设置当前线程为独占线程
        如果state不为0,且独占线程不是当前线程则:
            如果tail为null,设置tail和head为new Node()
            addWaiter(Node.EXCLUSIVE)  新加一个独占Node,把该Node添加到链表的尾部
            acquireQueued(Node)在for(;;)中执行
                如果node节点的上一个节点为head且tryAcquire为true,则设置node为head(获得了锁,同时删除了上一个节点)
                如果不是,则设置node节点的状态为Node.SIGNAL返回true,否者设置上一个节点状态为Node.SIGNAL,然后part线程,等待唤醒,继续执行for循环。        

    Release:
        设置state=state-1,如果state为0,设置独占线程为null
        找到head,如果head不为null,且head.waitStatus不为0(一般为Node.SIGNAL -1)则执行unparkSuccessor,找到head节点的next节点(该节点waitstatus为-1或0,如果节点状态为1取消的节点,会跳过),然后唤醒该节点



    newCondition:
        创建一个ConditionObject对象,该对象是内部类,共享Syn的状态,对象内部维护一个链表有firstWaiter 和 lastWaiter




    condition.await
        1、addConditionWaiter 添加一个节点new Node(Thread.currentThread(), Node.CONDITION),如果lastWaiter为null,那么firstWaiter 和 lastWaiter都为该node,否者把节点添加到lastWaiter后面,并设置为lastWaiter
        2、执行releasegetState()
        3、阻塞线程
        4、如果线程被唤醒,执行acquireQueued,把线程加入lock等待队列
        

    condition.signal
        1、找到firstWaiter节点 先compareAndSetWaitStatus(node, Node.CONDITION, 0)
        2、把节点加入到tail节点的末尾
        3、设置节点的状态为Node.SIGNAL
        4、唤醒线程

  • 相关阅读:
    PL/SQL Developer连接Oracle
    Oracle 11g 监听命令
    Oracle 11g的登陆问题
    PL/SQL Developer 配置和使用
    KMP应用求两个字符串的最长公共子串
    msc pool概念
    nformix调优之执行计划取得
    lsof 与fuser
    informix onstat命令收集
    各类系统上查看占cpu最多的进程
  • 原文地址:https://www.cnblogs.com/benx/p/3444665.html
Copyright © 2011-2022 走看看