synchronized 鎖永遠是物件,而非程式碼片段或方法。public synchronized void methodAAA() { ... }
等價於:
public void methodAAA() { synchronized(this) { ... } }
鎖:調用該方法的實例物件 (如 P1)。
含義:同一實例的多執行緒互斥;不同實例 (P2) 互不干擾,可同時進入。
public void method3(SomeObject so) {
synchronized(so) { ... } // 鎖為 so 物件
}
無明確鎖物件時,可建立專用鎖:
private byte[] lock = new byte[0]; // 零長度 byte[],建立最經濟 (3 位元碼 vs Object 7 位元碼)
synchronized(lock) { ... }
public synchronized static void staticMethod() { ... }
// 等價於
synchronized(Foo.class) { ... }
鎖:Class 物件 (Foo.class),而非實例。
注意:P1.getClass() 不等同 Foo.class (繼承時不同),不可用於鎖定類。
同一類別中,synchronized static 方法與 synchronized 實例方法鎖不同 (Class vs Instance),不會互斥,並發存取共享資料會導致競態條件。
private 欄位 + synchronized getter/setter,防止外部繞過同步直接修改。clone() 或副本,否則外部持有引用可繞過同步修改內部狀態。