天天看点

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();

}      

继续阅读