(https://github.com/Wasabi1234/Java-Concurrency-Progamming-Tutorial)java
public native void park(boolean var1, long var2); public native void unpark(Object var1);
举个例子:
git
直接使用Unsafe仍是有诸多不便之处,所以lock包提供了一个辅助类LockSupport封装了park和unpark程序员
举个例子:
github
能够看出,使用LockSupport要比直接只用Unsafe更加便捷。多线程
此外,LockSupport还能够用来给线程设置一个Blocker对象,便于调试和检测线程,其原理是使用Unsafe的putObject方法直接设置Thread对象的parkBlocker属性,并在合适的时候读取这个Blocker对象,例子以下:ui
各类锁ReentrantLock、ReentrantReadWriteLock以及各类同步器诸Semaphore、CountDownLatch等,核心都是AbstractQueuedSynchronizerthis
要真正从源头理解AQS,建议仔细阅读该类的设计者的论文
(http://gee.cs.oswego.edu/dl/papers/aqs.pdf)线程
让咱们先具体感知它是如何使用的。设计
这里有一个很是简单的例子SimpleLock,实现了一个最简单的排它锁。3d
运行结果代表,经过简单的几行代码,就实行了一个锁的全部功能。
根据JUC做者的建议,AQS的使用方法要遵循上面这个模式。
通常是
或者
这样可让暴露出的同步、互斥方法名由程序员自行决定。
例如各类锁可使用
Semaphore可使用
CountDownLatch可使用
要实现一个同步器,须要三个条件:
让咱们看看AQS又是如何设计知足的这三个条件。
private volatile int state; protected final int getState() { return state; } protected final void setState(int newState) { state = newState; } protected final boolean compareAndSetState(int expect, int update) { // See below for intrinsics setup to support this return unsafe.compareAndSwapInt(this, stateOffset, expect, update); }
state 为 volatile int型,它的CAS方法,提供原子的比较更新操做。
通常,AQS认为
LockSupport 提供了阻塞和解除阻塞的功能。所以,全部同步器的阻塞操做其实都是基于LockSupport的,也就是基于Unsafe的park和unpark方法的。
AQS内部提供了一个Node类型,它是用来造成“线程等待队列”的节点类型,以及一个由Node类型组成的队列。