---
# System prepended metadata

title: synchronized
tags: [Thread, Java]

---

# 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. 阻塞時無法被中斷 
