实现详解 - PatternDirClean/PDConcurrent GitHub Wiki
-
read()使用读锁 -
write()使用写锁 -
lock()上锁,但是需要主动指定锁类型 -
try***()尝试使用锁,所有锁都带有该前缀的变体
上面的锁均带有用于需要抛出异常的版本
第一个为要在并发域中运行的回调,为tryRunnable或者trySupplier,区别为一个不可以有返回值一个需要有返回值,这个通常交由编译器隐式转换即可
第二个用于在catch块中执行,可以不传入,被调用时传入上述运行的回调发生的异常,类型为Consumer或Function,依旧为可选返回值,此处不可再抛出异常
第三个用于在finally块中执行,可以不传入,被调用时会传入前两个回调的返回值,如过前两个回调为没有返回值的类型则不传入。
正常执行传入第一个回调的返回值,异常时才会传入第二个回调返回值,依旧为可选返回值,类型为Runnable或Function,此处不可再抛出异常
- 少了第二个回调参数,这意味着
catch块没有被使用,也意味着异常可以被抛出 - 在
finally块中执行的回调在异常时传入的值是null
运行回调中会多传入一个boolean,该参数代表着是否成功获取锁
ObjLock 用的是 java 的 synchronized 语句,如果构造时不传入参数,则用于synchronized(LOCK) LOCK 部分的对象为一个
new Object(),如果构造时传入对象则用对应的对象
ReLock 用的是ReentrantLock可重入锁,构造时可选择传入ReentrantLock对象或直接指定是否为公平锁
该锁默认使用lockInterruptibly()方法上锁,可通过Thread.interrupt()中断
该锁有一个追加的newCondition()方法,每次调用即运行一次ReentrantLock的newCondition()方法,支持通过isLocked()检查是否被上锁
RWLock 用的是ReentrantReadWriteLock可重入读写锁,其**read和**write方法中使用的也是对应的ReadLock和WriteLock
构造时可选择传入ReentrantReadWriteLock对象或者直接指定是否为公平锁
该锁默认使用lockInterruptibly()方法上锁,可通过Thread.interrupt()中断
该锁有追加的newReadCondition()和newWriteCondition()方法,调用时即运行一次ReadLock.newCondition()或
WriteLock.newCondition()方法
支持通过isLocked()、isReadLocked()、isWriteLocked()检查是否有占用、读写锁分别是否被占用
支持通过toread()进行写锁 => 读锁的锁降级