LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到Thread.suspend 和 Thread.resume所可能引发的死锁问题。因为park() 和 unpark()有许可的存在,调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。
说明:LockSupport是通过调用Unsafe函数中的接口实现阻塞和解除阻塞的
示例1:
public class WaitTest1 { public static void main(String args[]) { ThreadA ta = new ThreadA("ta"); synchronized (ta) { try { System.out.println(Thread.currentThread().getName() + " start ta."); ta.start(); Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + " block."); ta.wait(); System.out.println(Thread.currentThread().getName() + " continue."); } catch (InterruptedException e) { e.printStackTrace(); } } } static class ThreadA extends Thread { public ThreadA(String name) { super(name); } public void run() { synchronized (this) { System.out.println(Thread.currentThread().getName() + " wake up others."); notify(); } } } } //结果 main start ta. main block. ta wake up others. main continue.示例2:
public class LockSupportTest2 { private static Thread mainThread; public static void main(String args) { ThreadA ta = new ThreadA("ta"); mainThread = Thread.currentThread(); System.out.println(Thread.currentThread().getName() + " start ta."); ta.start(); System.out.println(Thread.currentThread().getName() + " block."); LockSupport.park(mainThread); System.out.println(Thread.currentThread().getName() + " continue."); } static class ThreadA extends Thread { public ThreadA(String name) { super(name); } public void run() { System.out.println(Thread.currentThread().getName() + " wake up others."); LockSupport.unpark(mainThread); } } } //结果 main start ta. main block. ta wake up others. main continue.说明:park和wait的区别——wait让线程阻塞前,必须先通过synchronized获取同步锁(即调用某个对象的wait()阻塞某个线程时必须保证该线程持有该对象为锁);park不需要获取同步锁,而且可以指定需要阻塞的线程