java - 是否存在具有 getAndWait() 方法的 HashMap?例如。 BlockingConcurrentHashMap 实现?

标签 java concurrency java.util.concurrent

很多线程可能会填充一个HashMap,在某些情况下我需要等待(阻塞)直到HashMap中存在一个对象,例如:

BlockingConcurrentHashMap map = new BlockingConcurrentHashMap();
Object x = map.getAndWait(key, 1000);    //(object_to_get, max_delay_ms)

想知道这样的事情是否已经存在,我讨厌重新发明轮子。

最佳答案

据我所知,没有可用的“传输 map ”。虽然理论上创建一个并不太难。

public class TransferMap<K,V> implements Map<K,V>{
  @GuardedBy("lock")
  private final HashMap<K,V> backingMap = new HashMap<K,V>();

  private final Object lock = new Object();
  public V getAndWait(Object key){
     synchronized(lock){
       V value = null;
         do{
            value = backingMap.get(key);

            if(value == null) lock.wait();

         }while(value == null); 
      }
      return value;
     }
   public V put(K key, V value){
      synchronized(lock){
         V value = backingMap.put(key,value);
         lock.notifyAll();
      }
     return value;
   }
  }

这个类别中有明显的排除项。更不用说锁变粗了;不用说它不会表现很好,但你应该了解发生了什么

关于java - 是否存在具有 getAndWait() 方法的 HashMap?例如。 BlockingConcurrentHashMap 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6389122/

相关文章:

java - JAX-RS REST 在 WildFly 工作,但不在 Tomcat 工作

concurrency - 如何在 Clojure 中创建一个持续运行的后台进程?

java - CyclicBarrier/CountDownLatch 和 Java 中的 join 有什么区别?

java - 是否有一个 java.util.concurrent 类允许定期启动线程而不阻塞完成?

java - 乘以概率矩阵,大量迭代时的值不正确

java - 有没有办法使用 JNI 从 Java 调用 C++ 的 STL 库?

java - java开发的最佳操作系统?

postgresql - 管理数以万计的桌面应用程序用户访问 PostgreSQL 数据库的最佳解决方案

java - 避免 boolean 翻转的同步块(synchronized block)

使用 Executor 的 JavaFX 应用程序在退出时挂起