前言 :
先说说这个 CLH锁:
加锁
1. 创建一个的需要获取锁的 Node
2. 通过 CAS操作 让自己 成为这个尾部的节点,然后令 设置自己的pre
3. 自旋,直到pre节点释放
释放:
1. 标记自己的状态为释放.
正文:
什么是在java里 AQS 是一个 抽象的同步队列.是的他是一个抽象类,他的子类要么用它实现了共享锁,要么实现了互斥锁.
也因此,在他的主类里 并没有实现 protected boolean tryAcquire(int arg) { throw new UnsupportedOperationException(); } 这个方法, 延迟到子类.以实现区别.
简单的说AQS 通过CAS维护 一个 <volatitle int state, exclusiveOwnerThread> 在表示目前是否有线程,以及哪个线程获取到了锁.
具体的入队,出队.代码分析我写在这里 http://www.cnblogs.com/shuly/p/7235997.html