天天看點

LockSupport線程之間的通訊

LockSupport是JDK中比較底層的類,用來建立鎖和其他同步工具類的基本線程阻塞原語。
LockSupport很類似于二進制信号量(隻有1個許可證可供使用),如果這個許可還沒有被占用,
目前線程擷取許可并繼續執行;如果許可已經被占用,目前線程阻塞,等待擷取許可。通過網上一些對LockSupport的源碼分析可知,
其實作是通過調用本地代碼(C++)來做的,具有很強的OS平台相關性,是以性能應該是非常高的。
對于JVM應用來說主要是通過調用LockSupport.park()和LockSupport.unpark()實作線程的阻塞和喚醒操作的,
當然實作線程間的阻塞和喚醒我們還可以用到對象鎖,通過Synchronizer關鍵字來實作對象同步鎖,
使用對象的wait()和notify()方法來實作,但是此方式的實作在性能上會大打折扣而且有些并發控制不當非常容易引發線程間死鎖,
可以說非常不優雅。

static Thread t1,t2=null;//内部類調用外部變量
public static void main(String[] args) {
    t1 = new Thread(()->{
        System.out.println("1");
        LockSupport.park();//調用native方法阻塞目前線程
        LockSupport.unpark(t2);//喚醒處于阻塞狀态的線程Thrread
    });
    t2 = new Thread(()->{
        System.out.println("1");
        LockSupport.park();
        LockSupport.unpark(t1);
    });

    t1.start();
    t2.start();

}      

繼續閱讀