多線程並發訪問共享資源(實例變量)時,會出現「非線程安全」問題:數據錯亂、邏輯錯誤。synchronized 充當「監督者」,強制線程排隊訪問同步代碼塊/方法,保證原子性與可見性。
this;靜態同步方法鎖 Class 對象。synchronized void foo(),線程 B 嘗試進入同對象的 synchronized void bar() 會阻塞。public class HasSelfPrivateNum {
public void addI(String userName) {
int num = 0;
if ("a".equals(userName)) { num = 100; sleep(100); }
else { num = 200; }
System.out.println(userName + " num=" + num);
}
}
// 兩線程共享同一 HasSelfPrivateNum 實例調用 addI,輸出交錯錯亂
public synchronized void addI(String userName) { ... }
輸出變為順序:先打印 a 相關,再打印 b 相關,線程安全達到。
public void addI(String userName) {
synchronized (this) { // 或 synchronized (lockObject)
// 關鍵區域
}
}
優點:縮小鎖範圍,提高併發度;可指定任意對象作為鎖。
this)。synchronized 不保護非同步方法對共享變量的訪問。後續將講解 volatile、Lock 接口、Condition、線程池、併發容器等進階主題。