java同步字符串作为id

发布于 2024-12-01 13:21:41 字数 704 浏览 0 评论 0原文

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

现在我的问题:

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

而不是在整个映射上同步,我们尝试在用户 ID 上同步,这会导致一些随机行为,如果我们使用 intern() 就可以了 第二个链接中的方法也有效

问题:

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

I have gone through the below links
Problem with synchronizing on String objects?
and
http://illegalargumentexception.blogspot.com/2008/04/java-synchronizing-on-transient-id.html

Now my question:

  1. I have a map where userid and a list of some properties are maintained
  2. when we come across new userid we will create an entry in the map
  3. if the userid is already present we will add some properties to the value

instead of synchronizing on the whole map, we tried to synchronize on the userid and that results in some random behavior, if we use intern() it works
the approach in the second link also works

Questions:

  1. in the second approach we are still locking the whole map when getting key
  2. is there some other way of synchronization so that the map access is synchronized based on userid alone
  3. what is the best way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

只是在用心讲痛 2024-12-08 13:21:41

最好的方法是使用 ConcurrentHashMap< /a> 来自 java.util.concurrent 包。这个课程内置了您需要的一切。不要重新发明轮子!

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

The best way is to use a ConcurrentHashMap from the java.util.concurrent package. This class has everything you need built right in. Don't re-invent the wheel!

Note: Thilo is right: You must use ConcurrentHashMap's special thread-safe version of put: putIfAbsent()

怀念你的温柔 2024-12-08 13:21:41

使用 ConcurrentMap

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

public UserProperties getProperties(String user) {
    UserProperties newProperties = new UserProperties();
    UserProperties alreadyStoredProperties = map.putIfAbsent(user, newProperties);
    if (alreadyStoredProperties != null) {
        return alreadyStoredProperties;
    }
    else {
        return newProperties;
    }
}

Use a ConcurrentMap<String, UserProperties>.

The code to get the appropriate UserProperties would look like this:

public UserProperties getProperties(String user) {
    UserProperties newProperties = new UserProperties();
    UserProperties alreadyStoredProperties = map.putIfAbsent(user, newProperties);
    if (alreadyStoredProperties != null) {
        return alreadyStoredProperties;
    }
    else {
        return newProperties;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文