LockSupport是用來建立鎖和其餘同步類的基本線程阻塞原語。
LockSupport中的park() 和 unpark() 的做用分別是阻塞線程和解除阻塞線程,並且park()和unpark()不會遇到「Thread.suspend 和 Thread.resume所可能引起的死鎖」問題。
由於park() 和 unpark()有許可的存在;調用 park() 的線程和另外一個試圖將其 unpark() 的線程之間的競爭將保持活性。this
簡單來講:從表面看到的現象就是:調用object的wait須要有一個監視器對象,不然拋出異常,而LockSupport不須要,能夠直接針對某個線程使用該效果spa
public class LockSupport2Test { 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() + " wakup others"); // 喚醒「主線程」 LockSupport.unpark(mainThread); } } }
public static void main(String[] args) { ThreadA ta = new ThreadA("ta"); synchronized (ta) { // 經過synchronized(ta)獲取「對象ta的同步鎖」 try { System.out.println(Thread.currentThread().getName() + " start ta"); ta.start(); 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) { // 經過synchronized(this)獲取「當前對象的同步鎖」 System.out.println(Thread.currentThread().getName() + " wakup others"); notify(); // 喚醒「當前對象上的等待線程」 } } }