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条)

报告相同问题?

悬赏问题

  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探