thread_LockSupport
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。
LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。
因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。
简单来说:从表面看到的现象就是:调用object的wait需要有一个监视器对象,否则抛出异常,而LockSupport不需要,可以直接针对某个线程使用该效果
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(); // 唤醒“当前对象上的等待线程” } } }