3

我已经浏览了以下链接 在 String 对象上同步有问题吗?http://illegalargumentexception.blogspot.com/2008/04/java-synchronizing-on-transient-id.html

现在我的问题:

  1. 我有一张地图,其中维护了用户 ID 和一些属性的列表
  2. 当我们遇到新的用户 ID 时,我们将在地图中创建一个条目
  3. 如果用户 ID 已经存在,我们将向该值添加一些属性

我们没有在整个地图上同步,而是尝试在用户 ID 上进行同步,这会导致一些随机行为,如果我们使用 intern() 它可以工作,第二个链接中的方法也可以工作

问题:

  1. 在第二种方法中,我们在获取密钥时仍然锁定整个地图
  2. 是否有其他同步方式,以便仅根据用户 ID 同步地图访问
  3. 做这个的最好方式是什么?
4

2 回答 2

3

最好的方法是使用java.util.concurrent包中的ConcurrentHashMap。这个类有你需要的所有东西。不要重新发明轮子!

注意:Thilo 是对的:你必须使用 ConcurrentHashMap 的 put 的特殊线程安全版本:putIfAbsent()

于 2011-08-26T09:48:33.500 回答
2

使用ConcurrentMap<String, UserProperties>.

获得适当的代码UserProperties如下所示:

public UserProperties getProperties(String user) {
    UserProperties newProperties = new UserProperties();
    UserProperties alreadyStoredProperties = map.putIfAbsent(user, newProperties);
    if (alreadyStoredProperties != null) {
        return alreadyStoredProperties;
    }
    else {
        return newProperties;
    }
}
于 2011-08-26T09:53:13.913 回答