Java多線程之LockSupport基礎篇

一、LockSupport有什麼用

  • LockSupport.park()方法能阻塞線程,LockSupport.unpark()方法能喚醒線程

二、LockSupport與wait()和notify() 有什麼區別

  • wait()需釋放鎖,因此必須結合synchronized使用(沒有加鎖鎖時使用會拋出IllegalMonitorStateException,反例代碼如下),notify()也要在synchronized使用,並且應該指定對象,synchronized(),wait(),notify() 操作的對象必須一致,一個synchronized()代碼塊中只能有1個線程wait()或notify()
public class MyThread {
    public static void main(String[] args) {
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName() + ":" + i);
                    if (i == 5) {
                        Thread.currentThread().wait();
                    }
                    if (i == 6) {
                        Thread.currentThread().notify();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }, "線程1").start();
        
    }
}

運行結果

  • LockSupport.park()LockSupport.unpark()可以結合synchronized使用,也完全可以不結合synchronized使用

LockSupport示例代碼注意看註釋

public class MyLockSupport {

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println(i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (i == 5) {
                    synchronized (MyLockSupport.class){
                    // i==5 的時時候阻塞”線程1“
                    LockSupport.park();
                    System.out.println(Thread.currentThread().getState());}
                }
            }

        },"線程1");
        thread1.start();
        /*喚醒指定的線程,注意此方法不一定比LockSupport.park()方法後執行,
         *一旦線程被執行了LockSupport.unpark(thread1)方法,此線程將不會被park了
         * */
        LockSupport.unpark(thread1);
        System.out.println(thread1.getState());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章