【问题标题】:Using a Java map safely as mutex holder安全地使用 Java 映射作为互斥锁持有者
【发布时间】:2021-04-07 10:24:55
【问题描述】:

要求是,方法 A 中的相关代码不能在任何具有相同类的 Object 上并行执行。

下面的伪代码能做到吗?

 private final Map<String, Object> simpleMutex = new HashMap<>();
 
 public void A( final Object o)
  {
    final ThreadLocal<Object> myLock = new ThreadLocal<>();
    synchronized ( simpleMutex )
    {
      myLock.set( simpleMutex.computeIfAbsent( o.getClass().getName(), className-> new Object() ) );
    }

    synchronized ( myLock.get() )
    {
      System.out.println("Executing A on " + o);
    }
  }

【问题讨论】:

    标签: java parallel-processing thread-safety


    【解决方案1】:
    private final Map<Class<?>, Object> locksMap = new ConcurrentHashMap<>();
    
    public void A(final Object o) {
         Object myLock = locksMap.computeIfAbsent(o.getClass(), className -> new Object());
         synchronized (myLock) {
              System.out.println("Executing A on " + o);
         }
    }
    

    【讨论】:

    • 谢谢,我正在阅读 ConcurrentMap 的 Javadoc,其中明确指出 computeIfAbsent 不是线程安全的。但是使用 ConcurrentHashMap 就是这样!
    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多