woaitiyu 2013-08-15 10:26
浏览 282
已采纳

方法中加锁的不同

现有如下代码,为什么getStatsMap1这个不能锁住,而getStatsMap2是可以的,这2者有什么区别,高手帮解释下,谢谢。

依据我的理解,对一个static 变量加锁和对方法加锁应该是效果一样

class TestThread {

private static Map<String, String> statsMap = null;

public Map<String, String> getStatsMap1() {
    synchronized (statsMap) {
        if (statsMap == null) {
            statsMap = getAllTable();
        }
    }
    return statsMap;
}

public synchronized Map<String, String> getStatsMap2() {
    if (statsMap == null) {
        statsMap = getAllTable();
    }
    return statsMap;
}

private Map<String, String> getAllTable() {
    Map<String, String> map = new HashMap<String, String>();
    map.put("user", "user");
    return map;
}

}

  • 写回答

2条回答 默认 最新

  • guazixing 2013-08-15 11:15
    关注

    两个方法锁定的资源不一样。在方法上同步,相当于实例的加锁。
    getStatsMap2的代码相当于:
    [code="java"]
    public Map getStatsMap2() {
    synchronized(this){
    if (statsMap == null) {
    statsMap = getAllTable();
    }
    return statsMap;
    }
    }
    [/code]
    方法1在竞争 statsMap 时会被锁上。但是:statsMap 的初始值为null,代码执行会报错的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?