執行緒同步與執行緒方法及執行狀態
阿新 • • 發佈:2021-11-19
-
-
執行緒方法
方法 說明 setPriority(int newPriority) 更改執行緒優先順序 static void sleep(long millis) 在指定的毫秒數內讓當前正在執行的執行緒體休眠 void join() 等待該執行緒終止 static void yield() 暫停當前正在執行的執行緒物件,並執行其他執行緒 void interrupt() 中斷執行緒,別用這個方式 boolean isAlive() 測試執行緒是否處於活動狀態 -
執行緒同步
-
由於同一程序的多個執行緒共享同一塊儲存空間,在帶來方便的同時,也帶來了訪問衝突問題,為了保證資料在方法中被訪問時的正確性,在訪問時加入鎖機制synchronized , 當一個執行緒獲得物件的排它鎖,獨佔資源,其他執行緒必須等待,使用後釋放鎖即可.存在以下問題:
-
一個執行緒持有鎖會導致其他所有需要此鎖的執行緒掛起
-
在多執行緒競爭下,加鎖﹐釋放鎖會導致比較多的上下文切換和排程延時,引起效能問題;如果一
-
個優先順序高的執行緒等待一個優先順序低的執行緒釋放鎖會導致優先順序倒置﹐引起效能問題.
-
-
同步方法
-
同步方法: public synchronized void method(int args){}
-
synchronized方法控制對“物件”的訪問,每個物件對應一把鎖,每個synchronized方法都必須獲得呼叫該方法的物件的鎖才能執行﹐否則執行緒會阻塞,方法一旦執行﹐就獨佔該鎖,直到該方法返回才釋放鎖﹐後面被阻塞的執行緒才能獲得這個鎖,繼續執行
-
-
同步塊
-
同步塊:synchronized((obj ){}
-
Obj稱之為同步監視器
-
Obj可以是任何物件﹐但是推薦使用共享資源作為同步監視器
-
同步方法中無需指定同步監視器,因為同步方法的同步監視器就是this ,就是這個物件本身,或者是class [反射中講解]
-
同步監視器的執行過程
-
第一個執行緒訪問,鎖定同步監視器﹐執行其中程式碼
-
第二個執行緒訪問,發現同步監視器被鎖定,無法訪問
-
第一個執行緒訪問完畢﹐解鎖同步監視器
-
第二個執行緒訪問,發現同步監視器沒有鎖﹐然後鎖定並訪問
-
-
-