首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用随机字符串的JAVA同步

使用随机字符串的JAVA同步
EN

Stack Overflow用户
提问于 2017-09-18 02:23:08
回答 2查看 81关注 0票数 1

我有一个关键的过程,我必须确保在任何时候都不能处理两个等价的MyObject (可以是不同的实例,但在逻辑上是相等的)。下面的代码演示了这个想法:

代码语言:javascript
复制
public class MyClass {
    public static ConcurrentMap<MyObject, String> concurrentMap = new ConcurrentHashMap<>();
    public void process(MyObject myObject) {
        String id = UUID.randomUUID().toString();
        String existingId = concurrentMap.putIfAbsent(myObject, id);
        synchronized (id) {
            if (existingId == null) {  // no others, start working right away
                // do work
            } else {  // an equivalent myObject is under processing, wait on it
                synchronized (existingId) {
                    // finally can start doing work
                }
            }
        }
    }
}

上面的代码在synchronized的帮助下对一个随机字符串进行工作。但是这个代码的问题是

  1. 每次它创建一个新的随机id时,如果一个现有的id已经链接到一个等价的MyObject,则不使用它。这种id的唯一目的是充当另一个线程要发现的唯一锁。考虑一下是否可以用一些实际的锁对象来代替?
  2. 这段代码中没有办法知道什么时候应该从MyObject中删除concurrentMap,尽管这并不影响结果,但是concurrentMap的增长可能并不好。你在想能不能在这里用一把锁的计数器?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-09-18 02:38:50

我不认为我真的理解这个想法的用例,这是一个巨大的危险信号。但在我看来,所有这些代码都是不必要的。如果这里唯一的想法是为myObject获得一个唯一的锁,那么您已经有了这样的想法:它是myObject

代码语言:javascript
复制
public class MyClass {

    public void process(MyObject myObject) {
       synchronized (myObject) {
           // finally can start doing work
       }
    }
}

其余的代码都是死记硬背的。

然而,这仍然令人忧虑。由于您依赖于外部过程来同步您的对象,任何其他引用myObject的代码都可以做他们喜欢的任何事情,并且您无法控制它。这是一种非常弱的同步形式。如果代码库中的每个人都理解在他们的MyObject上同步的必要性,这是可以工作的,但这在实践中可能很难实现。

票数 2
EN

Stack Overflow用户

发布于 2017-09-18 06:03:21

我认为库是你要找的东西。特别是StripedKeyLockManagerCountingLock类,它们解决了您的问题。您可以在项目中使用库,也可以根据需要调整其源代码。番石榴还通过剥光类提供了类似的功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46270744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档