实现详解 - PatternDirClean/PDConcurrent GitHub Wiki

所有锁都实现了SyLock接口

该接口定义了锁的标准方法大致归结为

  • read() 使用读锁
  • write() 使用写锁
  • lock() 上锁,但是需要主动指定锁类型
  • try***() 尝试使用锁,所有锁都带有该前缀的变体

上面的锁均带有用于需要抛出异常的版本

try类的方法完整参数有三个

第一个为要在并发域中运行的回调,为tryRunnable或者trySupplier,区别为一个不可以有返回值一个需要有返回值,这个通常交由编译器隐式转换即可

第二个用于在catch块中执行,可以不传入,被调用时传入上述运行的回调发生的异常,类型为ConsumerFunction,依旧为可选返回值,此处不可再抛出异常

第三个用于在finally块中执行,可以不传入,被调用时会传入前两个回调的返回值,如过前两个回调为没有返回值的类型则不传入。
正常执行传入第一个回调的返回值,异常时才会传入第二个回调返回值,依旧为可选返回值,类型为RunnableFunction,此处不可再抛出异常

可抛异常的变体与原方法的区别为

  • 少了第二个回调参数,这意味着catch块没有被使用,也意味着异常可以被抛出
  • finally块中执行的回调在异常时传入的值是null

try***与原方法的区别为

运行回调中会多传入一个boolean,该参数代表着是否成功获取锁

该接口的具体实现有 ObjLock ReLock RWLock

ObjLock

ObjLock 用的是 java 的 synchronized 语句,如果构造时不传入参数,则用于synchronized(LOCK) LOCK 部分的对象为一个 new Object(),如果构造时传入对象则用对应的对象

ReLock

ReLock 用的是ReentrantLock可重入锁,构造时可选择传入ReentrantLock对象或直接指定是否为公平锁

该锁默认使用lockInterruptibly()方法上锁,可通过Thread.interrupt()中断

该锁有一个追加的newCondition()方法,每次调用即运行一次ReentrantLocknewCondition()方法,支持通过isLocked()检查是否被上锁

RWLock

RWLock 用的是ReentrantReadWriteLock可重入读写锁,其**read**write方法中使用的也是对应的ReadLockWriteLock
构造时可选择传入ReentrantReadWriteLock对象或者直接指定是否为公平锁

该锁默认使用lockInterruptibly()方法上锁,可通过Thread.interrupt()中断

该锁有追加的newReadCondition()newWriteCondition()方法,调用时即运行一次ReadLock.newCondition()WriteLock.newCondition()方法

支持通过isLocked()isReadLocked()isWriteLocked()检查是否有占用、读写锁分别是否被占用

支持通过toread()进行写锁 => 读锁的锁降级

⚠️ **GitHub.com Fallback** ⚠️