zoukankan      html  css  js  c++  java
  • java-ReentrantLock

    ReentrantLock类的两个核心方法

    lock 调用的AQS的 acquire方法

    unlock 调用的AQS的 realse方法

    lock方法执行流程

    1. 上来先去尝试抢占锁 如果阻塞队列中没有node等待 获取成功直接返回 

    2. 加锁失败(阻塞队列前有node) 会把当前线程封装成node加入阻塞队列 如果是第一个入队的会帮head节点添加一个node

    3. 入队成功之后会优化一下当前node与阻塞队列中其他节点的关系,跳过取消状态的节点,进行park阻塞,

    4. 被唤醒后会自旋去获取锁,获取失败继续park 获取锁成功 会返回中断状态 

    lockInterruptibly方法

    跟lock方法很相似,区别是当线程是中断状态的时候抛出中断异常 

    进入cancleAcquire方法执行出队的逻辑

    分三种情况

    1. 被取消的node是tail节点 就用tail指向node的前一个node

    2. 如果是阻塞队列中的节点,就用node的前置节点指向node的后置节点 跳过node

    3. 如果node的前置节点是head节点,就唤醒node节点的下一个singal节点,这个节点去执行shouldPark..方法让head节点指向这个节点 跳过了被取消的节点

  • 相关阅读:
    区间树
    最大流
    单源最短路径
    散列表
    最小生成树
    软件体系结构2
    软件体系结构
    Leetcode 687.最长同值路径
    Leetcode 686.重复叠加字符串匹配
    Python测试框架
  • 原文地址:https://www.cnblogs.com/isnotnull/p/14604037.html
Copyright © 2011-2022 走看看