以如下代码 通过修改thread的数量,观察lock的状态
首先new一个线程,单独占用lock
public class T {
public static final ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
for(int i = 0; i < 1; i++) {
new Thread(new Runnable() {
@Override
public void run() {
lock.lock();
try {
System.out.println("lock");
try {
Thread.sleep(20000*1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
} finally {
lock.unlock();
}
}
}).start();
}
}
}
当lock.lock()执行完成后,state=1,因为只有一个线程,head和tail都为null,exclusiveOwnerThread为当前线程
image.png下面我们将线程数调整到2,只修改上面代码中 i 值
for(int i = 0; i < 2; i++) {}
image.png
此时可以看出 AQS中的CLH队列 head 和 tail 都有了值,head是个空Node,只有next指针指向了tail,tail中是实际当前调用lock线程的包装Node
后续有线程调用lock时也将从tail中CAS加入
参考文档
http://blog.csdn.net/pfnie/article/details/53191892
https://www.cnblogs.com/waterystone/p/4920797.html
https://www.zybuluo.com/mikumikulch/note/268244
http://blog.csdn.net/chenchaofuck1/article/details/51592429
http://blog.csdn.net/prestigeding/article/details/53158246 condition
网友评论