You may be disappointed if you fail, but you are doomed if you don't try.
如果你失敗了你也許會失望狗热,但如果你不嘗試,你就完了躲舌。
-
線程的存在是為了并行
- jvm虛擬機其實運行了許多線程
-
并發(fā)和并行
- 其實外在表象是相同的亥鸠,并發(fā)是一起走鸥诽,并行是輪轉(zhuǎn)
臨界區(qū) 阻塞 非阻塞
-
死鎖是一個靜態(tài)的問題汰瘫,不會再繼續(xù)下去毫胜。不會再占用更多cpu
- 搶占資源不釋放
- 等待共享資源
饑餓 類似于電梯遇人书斜。
-
活鎖
- 是一個動態(tài)的問題,線程不斷釋放酵使、獲取資源荐吉。一直在嘗試獲取資源
- 原子操作一直等待
-
無障礙
- 寬進嚴出 如果沖突必須要回滾數(shù)據(jù),所有線程都會進入臨界區(qū)
- 會不斷的重試
- 所有的線程相當于拿去當前的快照口渔,會一直嘗試样屠,知道拿到一個有效的快照
-
無鎖
- 無鎖必須要是無障礙的,保證有一個線程可以正常執(zhí)行缺脉,不至于所有的線程都一直在競爭資源痪欲、快照
-
無等待
- 無鎖
- 要求所有臨界區(qū)線程都可以在有限步完成,而且要求都在有限步當中完成操作
- 無饑餓
- 舉例
- 比如說讀寫攻礼、讀是無等待的业踢,但是寫會影響讀,為了不影響讀礁扮,就拷貝一份副本去修改知举,所以修改過程不會影響讀,這樣讀線程仍然是無等待的
- 寫也是無等待的太伊,他們不用相互同步雇锡。唯一有問題的是覆蓋回原始數(shù)據(jù)的時候,只是更改引用/指針去替換僚焦,但是他很快锰提。
-
阻塞
- 這個線程操作數(shù)據(jù),必然會影響其他線程。
Thread實現(xiàn)了runnable
如何優(yōu)雅的終止一個線程 interupt()
-
為何線程的操作都需要拋出異常
- 如果被中斷的時候可以立即作出響應欲账,比如tread.sleep()
- image.png
-
其實是java jvm層面的去調(diào)用notifyAll
- 喚醒等待在當前線程上的所有線程
- 當然 wait notifyAll 不要用在自己的線程實例上線
- 換句話說屡江,就是不一定能達到預期的目的