当前位置: 首页 > 面试题库 >

是否存在带有getAndWait()方法的HashMap?例如,一个BlockingConcurrentHashMap实现?

邵凯定
2023-03-14
问题内容

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

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

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


问题答案:

据我所知,没有可用的“转移地图”。尽管从理论上讲创建一个并不太困难。

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;
   }
  }

此类中有明显的排除项。更不用说锁粗化了;不用说它的性能不好,但是您应该了解发生了什么



 类似资料:
  • 本文向大家介绍js判断某个方法是否存在实例代码,包括了js判断某个方法是否存在实例代码的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js判断某个方法是否存在的代码。分享给大家供大家参考。 具体代码如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • 我有一个注册程序,用户可以在餐厅预订餐桌。 因为我需要存储潜在的无限量的客户,所以我不能显式地创建Customer类的新实例,因为我需要能够在运行时添加它们。 我想过使用HashMap通过他们填写的注册表插入每个用户,但是,它不是保留每个客户的唯一值,而是用哈希图中的最新条目覆盖它们。 明确地说,键正在改变,它成功地添加了一个新的键,但是前一个键中的值被覆盖了 例子 类客户有 3 个设置器:设置

  • 问题内容: 我有以“键-键”格式而不是“键-值”格式组织的数据。这就像一个HashMap,但是我将需要在两个方向上进行O(1)查找。这种数据结构是否有名称,Java的标准库中是否包含类似的名称?(或者Apache Commons?) 我可以编写自己的类,该类基本上使用两个镜像的Map,但我不想重蹈覆辙(如果已经存在,但我只是没有在寻找正确的术语)。 问题答案: Java API中没有此类。您想要的

  • 问题内容: 编译器不允许静态方法调用非静态方法。我知道这样做是因为非静态方法通常最终会使用实例变量。 但是拥有一个不使用实例变量的非静态方法是否有意义。如果我们的行为不影响实例状态或不受实例状态的影响,则不应将这种方法标记为静态。 问题答案: 通常,没有。如果该方法不涉及任何实例状态,则没有理由将其绑定到实例。 当然,静态方法不能被继承或覆盖,因此这是您明显希望拥有一个不使用实例状态的实例方法的明

  • 问题内容: 我有以下内容,其中是是,并且由表示: 我的应用程序中还实现了另一个。 我的问题是,从我的第二个中找出我是否包含特定内容的最佳方法是什么? 我尝试过但没有成功: 问题答案: 为什么不: 而且,如果您必须遍历整个,而不是只寻找一个特定值: 编辑 过去,我用一些Java 8惯用语对此进行了更新。 Java 8流API允许使用更具声明性(并且可以说是优雅的)的方式来处理这些类型的迭代。 例如,

  • 本文向大家介绍PHP自带方法验证邮箱是否存在,包括了PHP自带方法验证邮箱是否存在的使用技巧和注意事项,需要的朋友参考一下 PHP校验邮箱地址的方法很多, 比较常用的就是自己写正则了, 不过正则多麻烦, 我PHP自带了方法做校验。 filter_var filter_var是PHP内置的一个变量过滤的方法, 提供了很多实用的过滤器, 可以用来校验整数、浮点数、邮箱、URL、MAC地址等。 filt