多線程的面試題解答(二)

1.什麼是可重入鎖ReentrantLock


         線程可以進入任何一個它已經擁有鎖同步的代碼塊。同一個線程,外層函數獲取鎖後,內層仍然有獲取該鎖的代碼。ReentrantLock還提供了中斷鎖和定時鎖等待。


2.當一個線程進入某個對象的一個synchronized的實例方法後,其它線程是否可進入此對象的其它方法?

          如果該對象其他方法沒有加synchronized關鍵字,可以進入

          如果該方法調用了wait方法,則可以進入

          如果其它方法沒有synchronized同時該方法沒有調用wait,則不可以進入

          如果其他方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因爲非靜態的方法用的是該對象。

          如下:

/**
 * @author: krauser
 * @date: Create in 下午5:39 2017/12/27
 * @Description:
 */
public class TestSyn {

    static class test {

        public static synchronized void add() throws InterruptedException {
            System.out.println("add..");
            TimeUnit.SECONDS.sleep(3);
        }

        public static synchronized void get() throws InterruptedException {
            System.out.println("get..");
        }

    }


    public static void main(String[] args) throws InterruptedException {
        //test testSyn = new test();
        new Thread(() -> {
            try {
                test.add();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(() -> {
            try {
                test.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        TimeUnit.SECONDS.sleep(10);
    }

}


3.synchronized和java.util.concurrent.locks.Lock的異同

性能差不多,都是實現線程的之間的同步。

Lock可以主動中斷鎖,還提供了一個condition對象


4.樂觀鎖和悲觀鎖

1.悲觀鎖:即很悲觀,每次拿數據的時候都覺得數據會被人更改,所以拿數據的時候就把這條記錄鎖掉,這樣別人就沒法改這條數據了,一直到你的鎖釋放。
2.樂觀鎖:即很樂觀,查詢數據的時候總覺得不會有人更改數據,等到更新的時候再判斷這個數據有沒有被人更改,有人更改了則本次更新失敗。

悲觀鎖用MUTEX實現,互斥鎖(排他鎖)
樂觀鎖用CAS實現









發佈了36 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章