天天看點

多線程面試問題總結

start和run之間的差別

https://www.cnblogs.com/agilestyle/p/11421515.html

線程的狀态

1、NEW

2、RUNNABLE(RUNNING/ READY)

3、WAITING

4、TIMED_WAITING

5、BLOCKED

6、TERMINATED

多線程面試問題總結

線程不安全的五個因素:

1、CPU搶占式執行

2、記憶體可見性(volatile可解決,操作完成時強制删除工作記憶體)

3、指令重排序(編譯器優化)

4、原子性

5、多線程同時修改同一個變量

線程安全問題解決方案

1、鎖(讓線程排隊執行)–synchronized實作原理

2、私有變量

synchronized和lock差別

1、修飾不同,synchronized修飾代碼塊,靜态方法和普通方法;lock隻修飾代碼塊;

2、鎖政策不同,synchronized是非公平鎖,lock可以啟用公平鎖,參數true

3、synchronized 自動加鎖解鎖,lock是手動鎖

volatile和synchronized

1、synchronized解決線程不安全的原子性

2、volatile解決記憶體可見性問題

死鎖

定義:由于多線程資源搶占而造成的無限等待問題;

(1)死鎖形成要同時滿足四個條件:

1、互斥條件(一個資源隻能被一個線程持有)

2、請求擁有條件(擁有一個資源後,該線程又請求另外一個資源)

3、不可剝奪條件(資源被線程持有後,不能被剝奪)

4、環路等待條件(多線程在擷取資源時形成了一個環形鍊)

(2)如何解決死鎖?

破壞造成死鎖的條件,其中互斥條件和不可剝奪條件不可更改,請求擁有條件和環路等待條件可以更改。

線程的通訊機制

wait/notify/notifyall(隻能喚醒目前對象的所有等待線程)

wait為什麼要加鎖?

sleep有明确的時間喚醒,wait預設不傳參數,表示永久等待,需要有結束等待的機制,這個機制就是釋放鎖,是以在釋放鎖之前需要有一把鎖。

Thread.sleep(0) VS Object.wait(0)

1、sleep他是Thread的靜态方法;而wait是Object的方法;

2、sleep(0)是立即觸發一次CPU的資源搶占,給其他線程多一次機會;

wait(0)是永久的等待下去;

3、倆者都不能接受負數參數,

wait 和 sleep 的差別

1、共同點

①都可以讓線程休眠

②都需要處理Interrupt異常

2、不同點

①來自的對象不同,sleep來自Thread,wait來自Object

②參數:wait可以沒有參數,sleep必須要有大于等于0的參數

③wait使用時必須要加鎖,sleep使用時不用加鎖

④wait使用時會釋放鎖,而sleep不會釋放鎖(如何證明?)

⑤wait預設不傳參name會進入waiting,sleep會進入timed_waiting

為什麼将wait放于Object而不是Thread?

wait操作需要有加鎖和釋放鎖的過程,而鎖又是屬于對象級别而不是線程級别,一個線程可以擁有多把鎖,而一個對象隻有一把鎖,如果wait放入線程中的話需要指定釋放哪一把鎖?是以靈活起見放入Object。

wait VS LockSupport

1、共同點

①都可以讓線程休眠

②都可以傳參或不傳參,并且二者線程狀态也是一緻的

2、不同點

①wait必須配合synchronized(加鎖),LockSupport不需要加鎖

②wait隻能喚醒全部或者随機的某一個線程,LockSupport可以喚醒執行的線程

③wait來自Object,LockSupport是一個普通類

繼續閱讀