五大核心規則:
synchronized(this) 同步區塊,同一時間僅一執行緒執行,另一執行緒需等待。synchronized(this) 區塊時,另一執行緒仍可存取該物件的非同步區塊。synchronized(this) 區塊時,其他執行緒對該物件所有 synchronized(this) 區塊的存取將被阻塞。synchronized 方法(隱含 this 鎖)。synchronized(otherObj))同樣適用。public class Thread1 implements Runnable {
public void run() {
synchronized(this) {
for (int i=0;i<5;i++)
System.out.println(Thread.currentThread().getName()+" synchronized loop "+i);
}
}
public static void main(String[] args) {
Thread1 t1=new Thread1();
new Thread(t1,"A").start();
new Thread(t1,"B").start();
}
}
輸出:A 完整跑完 0-4,B 再跑 0-4。驗證規則一。
public class Thread2 {
public void m4t1() { synchronized(this){ /* 睡眠 500ms 迴圈 */ } }
public void m4t2() { /* 非同步,相同睡眠迴圈 */ }
main: 兩執行緒分別呼叫 m4t1、m4t2 → 輸出交替顯示。驗證規則二。
}
將 m4t2() 改為 synchronized(this) → 輸出 t1 完整跑完,t2 再跑。驗證規則三。
將 m4t2() 改為 public synchronized void m4t2() → 結果同案例三。驗證規則四。
內部類別 Inner,外部類別以 synchronized(inner) 鎖定 inner 物件呼叫 inner.m4t1(),另一執行緒直接呼叫 inner.m4t2()(非同步) → 交替輸出;若 m4t2 也同步 → 互斥。驗證規則五。