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(); // 喚醒「當前對象上的等待線程」
            }
        }
    }
本站公眾號
   歡迎關注本站公眾號,獲取更多信息