concurrentHashMap的片段用于检索对象或在缺少时创建它(作为原子操作)

Zo7*_*o72 2 java java.util.concurrent concurrent-programming

在Java中,我想做这样的事情:

   Object r = map.get(t);
   if (r == null) {
      r = create(); // creating r is an expensive operation.
      map.put(t, r);  
   }
Run Code Online (Sandbox Code Playgroud)

现在,代码片段可以在多线程环境中执行. map可以是ConcurrentHashMap.

但是我如何使逻辑成为原子?

请不要像"同步"块那样给我一些简单的解决方案.我希望这个问题可以一劳永逸地解决.

Joa*_*uer 6

它被Guava整齐地解决了.

使用CacheBuilder和调用build一个CacheLoader.这将返回一个LoadingCache对象.如果你真的需要一个Map实现,你可以打电话asMap().

还有上了年纪MapMakermakeComputingMap,但那是赞成的过时CacheBuilder做法.

当然你也可以手动实现它,但正确地执行它是非常重要的.需要考虑的几个方面是:

  • 你想避免create使用相同的输入调用两次
  • 你想等待当前线程完成创建但不希望用空闲循环执行此操作
  • 你想避免在好的情况下同步(即元素已经在地图中).
  • 如果两个create呼叫同时发生,你希望每个呼叫者只等待与他相关的呼叫.