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というクラスを学ぶ.
 
    // 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