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、唤醒线程

  • 相关阅读:
    微信小程序实现课程表实例
    探索Java中的网络编程技术
    Java中的Spring MVC简介笔记
    我没有想赢,我只是不想输
    下次路过,人间再无我。
    从零基础入门MySQL数据库基础课
    vue.js-详解三大流行框架VUE_快速进阶前端大咖-Vue基础
    学习网站/实用工具,收藏的快搜网站,想找什么都有!!!
    【灵魂拷问】你真的懂得Mysql的管理和使用吗?
    【领会要领】web前端-轻量级框架应用(jQuery基础)
  • 原文地址:https://www.cnblogs.com/benx/p/3444665.html
Copyright © 2011-2022 走看看