【问题标题】:synchronized method read same member variable failed, why?同步方法读取相同的成员变量失败,为什么?
【发布时间】:2014-05-15 14:32:19
【问题描述】:

你好,有人可以帮助我吗? 当多个线程访问mKeySet时,有人在方法toValue中随机读取为零大小,而不是null,为什么?

for (String key : mKeySet) {
    String v = map.get(key);
    if (v == null) {
        v = EMPTY;
    }
    if (i > 0)
        buf.append(",");
    buf.append("'").append(v).append("'");
    i++;
}

我刚刚同步了方法?

【问题讨论】:

  • map.keySet() 返回一个由地图支持的 Set,因此当您在方法之外修改地图时,mKeySet 也会发生变化!相反,您必须复制集合,例如使用新的 HashSet(map.keySet())。除此之外,您的方法没有正确同步,因此不是线程安全的。

标签: java multithreading synchronized


【解决方案1】:

您已经在 Datastore 类上同步了方法 store,而不是映射 --- 换句话说,您正在锁定 Datastore 对象。

如果地图还有其他用户,您需要同步您对map的访问——锁定地图本身——而不是方法:synchronized (map) { // Do things to the map }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 2010-12-04
    • 1970-01-01
    • 2014-07-25
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多