-
多線程的狀態:
-
CPU的執行資格:可以被cpu處理,在處理隊列中排隊。
-
CPU的執行權:正在被cpu處理。
-
創建線程的第二種方式---實現Runnable接口
-
創建線程的第一種方式:繼承Thread類。
-
創建線程的第二種方式:實現Runnable接口:
-
1定義類實現Runnable接口。
-
2覆蓋接口中的run方法,將線程的任務代碼封裝到run方法中。
-
3通過Thread類創建線程對象,並將Runnable接口的子類對象作爲Thread類的構造函數的參數進行傳遞。(因爲線程的任務都封裝在Runnable接口子類對象的run方法中,所以要在線程對象創建時就必須明確要運行的任務。)。
-
4調用線程對象的start方法開啓線程。
-
第二種方式(Runnable接口)的好處:
-
1 將線程的任務從線程的子類中分離出來,進行了單獨的封裝。按照面向對象的思想將任務封裝成對象。
-
2避免了java單繼承的侷限性。
-
所以,創建線程的第二種方式較爲常用。
-
賣票示例:
-
線程安全問題的現象:
-
線程安全問題產生的原因:
-
1多個線程在操作共享的數據。
-
2 操作共享數據的線程代碼有多條。
-
當一個線程在執行操作共享數據的多條代碼過程中,其他線程參與了運算就會導致線程安全問題的產生。
-
解決思路:就是將多條操作共享數據的線程代碼封裝起來,當有線程在執行這些代碼的時候,其他線程不可以參與運算。必須要當前線程把這些代碼都執行完畢後,其他線程纔可以參與運算。
-
在java中,用同步代碼塊就可以解決這個問題。
-
同步代碼塊的格式:
-
synchronized(對象)
-
{需要被同步的代碼;
-
}
-
同步的好處和弊端:
-
同步的好處:解決了線程的安全問題。
-
同步的弊端:相對降低了效率,因爲同步外的都會判斷同步鎖。
-
同步的前提:同步中必須有多個線程並使用同一個鎖。
-
同步函數:
-
驗證同步函數的鎖:同步函數的使用的鎖是this。
-
同步函數和同步代碼塊的區別:同步函數的鎖是固定的this。
-
同步代碼塊的鎖是任意的對象。
-
建議使用同步代碼塊。
-
靜態同步函數的鎖:獲取字節碼文件的字節碼文件對象。
-
靜態的同步函數使用的鎖是該函數所屬字節碼文件對象可以用getClass方法獲取,也可以用當前類名.class表示。
-
-
單例模式涉及的多線程問題:
-
死鎖實例:死鎖常見情景之一:同步的嵌套。
-
-
JAVA學習筆記(13)多線程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.