首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java synchronized 關鍵字深度解析:鎖對象、作用域與實戰應用

     編輯:Java 相關知識

核心機制

synchronized 提供互斥同步,鎖住的是對象監視器。根據修飾目標不同,鎖對象與作用域有所差異。

三種鎖定方式

1. 修飾實例方法 / synchronized(this)

public synchronized void method() { ... }
// 等同於
public void method() { synchronized(this) { ... } }

鎖為當前實例。同一實例的不同執行緒互斥;不同實例則不互斥。

2. 修飾靜態方法 / synchronized(Class.class)

public static synchronized void staticMethod() { ... }
// 等同於
public void staticMethod() { synchronized(MyClass.class) { ... } }

鎖為Class 對象。所有實例共享同一把鎖,任何執行緒呼叫皆互斥。

3. 修飾程式碼區塊 synchronized(obj)

可指定任意對象為鎖,靈活控制同步粒度。

實戰案例:表單 Token 防重複提交

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) {
        // 驗證邏輯...
    }
}

常見誤區與注意事項

  • 鎖對象不可變:若鎖對象引用改變,同步失效。
  • 避免使用 String 常量 作為鎖(常量池導致不同類別共享同一把鎖)。
  • 不可重入:同一執行緒可重複獲得同一把鎖。
  • 效能考量:JDK 1.6+ 引入偏向鎖、輕量級鎖、鎖消除等優化,但仍建議縮小同步區塊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved