synchronized 提供互斥同步,鎖住的是對象監視器。根據修飾目標不同,鎖對象與作用域有所差異。
public synchronized void method() { ... }
// 等同於
public void method() { synchronized(this) { ... } }
鎖為當前實例。同一實例的不同執行緒互斥;不同實例則不互斥。
public static synchronized void staticMethod() { ... }
// 等同於
public void staticMethod() { synchronized(MyClass.class) { ... } }
鎖為Class 對象。所有實例共享同一把鎖,任何執行緒呼叫皆互斥。
可指定任意對象為鎖,靈活控制同步粒度。
public abstract class TokenBaseController {
private static final Map tokenMap = new HashMap<>();
public String generateGUID(HttpSession session) {
String token;
synchronized (tokenMap) { // 鎖住共享 Map
token = new BigInteger(165, new Random()).toString(36).toUpperCase();
tokenMap.put(DEFAULT_TOKEN_NAME + "." + token, token);
session.setAttribute(TOKEN_KEY, tokenMap);
}
return token;
}
public boolean validToken(HttpServletRequest request) {
// 驗證邏輯...
}
}