標籤:his 重入 共用 art run 另一個 start 變數 waiting
1、run()和start()的區別
2、線程的基本屬性和方法
- id:一個遞增的整數,每建立一個線程就加一
- name
- 優先順序:從1到10,預設為5,會映射到系統中的優先順序。數字越大,要優先順序越高
- 狀態:
-
- NEW :還沒調用start
- RUNABLE:正在執行run或者正在等待cup分配時間
- BLOCKED:被阻塞
- WAITING:被阻塞
- TIMED_WAITING:被阻塞
- TERMINATED:結束
- 是否daemo線程
- sleep方法, 單位是毫秒
- yield方法,建議讓出cpu
- join方法,join(0)或join()標示無限期等待
- 過時方法 stop(),suspend(),resume(),已經過時,不應再使用
3、競態條件:當多個線程訪問和操作同一個對象時,最終執行結果與執行時序有關,可能正確也可能不正確。
解決方案:
- 使用synchronized關鍵字
- 使用顯示鎖
- 使用原子變數
4、記憶體可見度:多個線程可以共用訪問和操作相同的變數,但一個線程對一個共用變數對修改,另一個線程不一定馬上就能看到,甚至永遠也看不到。因為涉及到寄存器和各級緩衝。
解決方案:
- 使用volatile關鍵字
- 使用synchronized關鍵字
5、synchronized
synchronized可用於修飾類的執行個體方法(保護this),靜態方法(保護類對象),代碼塊(任意對象)。
synchronized保護的是對象而非代碼,只要訪問的是同一對象的synchronized方法,即使是不同的代碼,也會被同步順序執行。
所以多個線程是可以同時執行同一個synchronized執行個體方法的,只要他們訪問的對象是不同的即可。
可重新進入性:通過記錄鎖的持有線程和持有數量來實現的。
保證記憶體可見度:在釋放鎖時,所有寫入都會寫回到記憶體,而獲得鎖後,都會從記憶體中讀最新資料。
如果只是保證記憶體可見度,synchronized的成本有點高,
Java的編程邏輯--15章 並發