LockSupportソース読み
3129 ワード
Javaでは、スレッドを待つ最も一般的な方法はObjectを呼び出すことです.wait()メソッド、
Causes the current thread to wait until another thread invokes the notify() method for this object.
しかし、JUC(java.util.concurrent)のソースコードを読むと、このパッケージがそうではないことに気づき、CountDownLatchを追跡しました.await()呼び出し、最後にLockSupportについてきました.park()メソッドでは、ここで呼び出されるのはunsafeです.park()メソッドはブロックスレッドに来ます.
LockSupportはCASと同様にJUCの多くの制御メカニズムの基礎である(しかし、彼らの底層は実際にはUnsafeに依存している).次はLockSupportというクラスを学ぶ.
次はコードを書いてみます
Causes the current thread to wait until another thread invokes the notify() method for this object.
しかし、JUC(java.util.concurrent)のソースコードを読むと、このパッケージがそうではないことに気づき、CountDownLatchを追跡しました.await()呼び出し、最後にLockSupportについてきました.park()メソッドでは、ここで呼び出されるのはunsafeです.park()メソッドはブロックスレッドに来ます.
LockSupportはCASと同様にJUCの多くの制御メカニズムの基礎である(しかし、彼らの底層は実際にはUnsafeに依存している).次はLockSupportというクラスを学ぶ.
// Hotspot implementation via intrinsics API
private static final Unsafe unsafe = Unsafe.getUnsafe(); //unsafe
private static final long parkBlockerOffset; // , unsafe
//This object is recorded while
// the thread is blocked to permit monitoring and diagnostic tools to
// identify the reasons that threads are blocked.
// blocker ,blocker ,debug
private static void setBlocker(Thread t, Object arg) {
// Even though volatile, hotspot doesn't need a write barrier here.
unsafe.putObject(t, parkBlockerOffset, arg);
}
//block , block permit available
//permit 1,0 , 0, unpark +1 1 , park 1 0 (park ),
// park block( 1 , , 1), unpark 1 ( )
// permit, permit , unpark
// permit available , , block, block 3
//1. unpark( )
//2. interrupts
//3. The call spuriously (that is, for no reason) returns.
public static void park() {
unsafe.park(false, 0L);
}
// , permit avaliable,
public static void unpark(Thread thread) {
if (thread != null)
unsafe.unpark(thread);
}
// park 2 , 3 park version, 3 version blocker debug
public static void parkNanos(long nanos) {
public static void parkUntil(long deadline) {
次はコードを書いてみます
System.out.println("start");
LockSupport.parkNanos(1000000000);
System.out.println("end");
// block ,
System.out.println("start");
LockSupport.unpark(Thread.currentThread());
LockSupport.parkNanos(1000000000);
System.out.println("end");
// block, permit
System.out.println("start");
LockSupport.unpark(Thread.currentThread());
LockSupport.unpark(Thread.currentThread());
LockSupport.parkNanos(1000000000);
System.out.println("inter");
LockSupport.parkNanos(1000000000);
System.out.println("end");
// park block, 2 , permit unpark