zoukankan      html  css  js  c++  java
  • ReentrantLock && AQS

    1. ReentrantLock 源代码

    使用AQS框架,CAS的操作代替了Synchronized里面的重量级锁, AQS里边维护一个队列,存储需要拿到资源的Thread

    a. ReentrantLock 内部类

    abstract static class Sync extends AbstractQueuedSynchronizer 

    nonfairTryAcquire

    tryRelease

    static final class NonfairSync extends Sync 

    static final class FairSync extends Sync

    b. 构造方法

    public ReentrantLock() {
        sync = new NonfairSync();
    }


    public ReentrantLock(boolean fair) {
         sync = fair ? new FairSync() : new NonfairSync();
    }

    c. 重点方法

    public void lock() {
      sync.lock();
    }

    public void unlock() {
      sync.release(1);
    }

    public void lockInterruptibly() throws InterruptedException {
      sync.acquireInterruptibly(1);
    }

    public boolean tryLock() {
      return sync.nonfairTryAcquire(1);
    }

    public boolean tryLock(long timeout, TimeUnit unit)
    throws InterruptedException {
      return sync.tryAcquireNanos(1, unit.toNanos(timeout));
    }

    2. class AbstractQueuedSynchronizer

    a. 内部类 

    static final class Node

    public class ConditionObject 

    b. 变量

     private transient volatile Node head;

     private transient volatile Node tail;

    private volatile int state;

    c. 主要方法

    使用For去不断的循环查看前面的Node是Head,如果是,则试着获取锁,直到获取完锁才停止

  • 相关阅读:
    redis 写入数据 越来越慢 是什么原因
    redis slowlog
    JavaCC 规格严格
    Lucene 规格严格
    数据库建立索引要点 规格严格
    编辑距离 规格严格
    Lucene NRT (Near Real Time) 规格严格
    事件关联 规格严格
    linux下mysql5.5.19编译安装笔记【已验证】 规格严格
    关于CLOSE BY CLIENT STACK TRACE 规格严格
  • 原文地址:https://www.cnblogs.com/Ivyduan/p/14627709.html
Copyright © 2011-2022 走看看