AQS要点整理
所属分类 java
浏览量 1409
java.util.concurrent
AbstractQueuedSynchronizer
ReentranLock vs Synchronized
Synchronized 不可中断
公平锁和非公平锁
public class ReentrantLock implements Lock, java.io.Serializable {
private final Sync sync;
abstract static class Sync extends AbstractQueuedSynchronizer
static final class NonfairSync extends Sync
static final class FairSync extends Sync
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
// 持有锁的线程
private transient Thread exclusiveOwnerThread;
// Head of the wait queue
private transient volatile Node head;
private transient volatile Node tail;
private volatile int state;
state 为 0 ,表示锁没有被占用
1 锁已经被占用,大于1表示重入次数
compareAndSetState
等待队列 CLH(Craig, Landin, and Hagersten)
双向队列 队头为占用锁的线程, 获取所失败的线程加入队尾
释放锁 唤醒后继节点
LockSupport park unpark
public static void park(Object blocker) {
Thread t = Thread.currentThread();
// 设置阻塞对象,记录线程被谁阻塞的,用于线程监控和分析工具来定位
setBlocker(t, blocker);
UNSAFE.park(false, 0L);
setBlocker(t, null);
}
上一篇
下一篇
elasticsearch term 和 match
kafka1.1.0无法消费问题
JMX配置及java客户端远程连接JMX端口
自定义类加载器例子
java类加载器要点整理
kibana安装配置及使用