建立線程的第一種方式:繼承Thread類。java
建立線程的第二種方式:實現Runnable接口。安全
實現runable接口的好處:
1.將線程的任務從線程的子類中分離了出來,實現了單獨的封裝
2.避免了java的繼承的侷限性函數
線程安全的問題的產生 的緣由
1.多個線程在操做共享的數據
2.操做共享的數據的代碼有多條this
當一個線程在操做共享的數據的多條代碼的過程當中,另外的線程也參與了操做,就會致使線程的安全問題spa
解決的思路:
吧操做共享數據的多條代碼封裝起來 ,當線程在操做這些數據的時候,其餘線程不能參與進來
java中 ,同步代碼塊就能解決這個問題
同步代碼快的格式
synchronized(對象){
須要被同步的代碼
}
同步的好處 :
解決了線程安全的問題
同步的弊端:
相對下降了效率,由於線程在執行的過程當中其餘線程都會判斷同步鎖;
同步的前提:
同步中必須有多個線程並所用同一個鎖線程
同步函數和同步代碼塊的區別:
同步函數的鎖是this
同步代碼塊的鎖是任意的對象
因此建議使用同步代碼塊對象
靜態同步函數的鎖是 該函數所屬的字節碼文件的對象繼承
死鎖,當a線程進入同步的時候,須要調用b鎖,當b鎖進步同步的時候須要a鎖就會形成死鎖 接口