# synchronized ###### tags: `Java` `Thread` **Introducde** 只可修飾block、method 該關鍵字提供了一種互斥機制,同一時間只會有一個執行緒訪問同步資源 1. 此關鍵字提供了一種鎖的機制,能夠確保共享變量的互斥訪問 2. 此關記字包括了moniter enter 和 moniter exit 兩個JVM指令他能保證認何時後任何執行緒執行到moniter enter時都必須從main memory取得資料而不是cache;moniter exit成功後cache內被更新的值被需回寫main memory 3. 嚴格遵守happen-before規則;一個moniter exit之前必有一個moniter enter **** **需注意問題** 1. 與moniter關聯的物件不能為null private static Object mutex = null; public void synMethod(){ synchronized(mutex ){ //syn code } } 2. synchronized作用域太大 synchronized作用域內的代碼需執行完畢,才會輪到下一個執行緒,因此作用域內處理的邏輯太多會導致校能低落 3. 不同的moniter 鎖相同的方法 private static Object mutex = new Object(); public void synMethod(){ synchronized(mutex ){ //syn code } } 4. 死鎖 **** **Moniter** JAVA中任何實例(包括class object)皆可被當作Mutex 而synchronized會關聯到指定實例取得moniter lock This Moniter public synchronized void synMtehod().. public void synMtehod(){ synchronized(this){ //syn code } } Class Moniter public synchronized static void synMtehod().. public void synMtehod(){ synchronized(xxx.class){ //syn code } } **** **Other :** Object wait() 1. 需要在取得moniter lock的synchronized 區塊內執行否則拋錯 並且執行後會後放棄moniter lock 2. 執行後會進入BLOCKED直到其它執行緒執行Object notify() or notifyAll() or interrupt.. Object notify() 3. 喚醒一個正在執行該實例的wait()方法的執行緒 4. 需要在取得moniter lock的synchronized 區塊內執行否則拋錯 **** **缺陷** 1. 無法控制阻塞的時間 2. 阻塞時無法被中斷