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是一個普通類