java上的字符串同步为id

时间:2011-08-26 09:42:54

标签: java string synchronization string-interning

我已经通过以下链接 Problem with synchronizing on String objects?http://illegalargumentexception.blogspot.com/2008/04/java-synchronizing-on-transient-id.html

现在我的问题:

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

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

    问题:

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

2 个答案:

答案 0 :(得分:3)

最好的方法是使用ConcurrentHashMap中的java.util.concurrent package。这个课程包含您需要的所有内容。不要重新发明轮子!

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

答案 1 :(得分: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;
    }
}