thread_LockSupport

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(); // 唤醒“当前对象上的等待线程”
            }
        }
    }
本站公众号
   欢迎关注本站公众号,获取更多信息