【问题标题】:How can I allow concurrent writes on different parts (with different keys) of a guava multimap如何允许在番石榴多图的不同部分(使用不同的键)上同时写入
【发布时间】:2014-11-04 16:04:48
【问题描述】:

我正在使用 google guava multimap,想知道是否可以允许并发写入到地图的不同部分,或者我是否必须同步所有访问?当我说不同的部分时,我指的是多重映射中不同的键值对。

以下示例代码是否正确?

  class Key {}
  class Value {}

  private Multimap<Key, Value> multimap = HashMultimap.create();

  private final Striped<Key> locks = Striped.readWriteLock(100);

  public void write(final Key key, final Collection<Value> values) {
     Lock writeLock = locks.get(key).writeLock();
     writeLock.lock();

     try {
        for (Value value : values) {
           multimap.put(key, value);
        }
     } finally {
       writeLock.unlock();
     }
  }

  public Collection<Value> read(final Key key) {
     Lock readLock = locks.get(key).readLock();
     readLock.lock();

     try {
      // Collect values
     } finally {
       readLock.unlock();
     }
  }

【问题讨论】:

  • Guava 目前不支持多线程访问多图;你必须同步整个shebang。

标签: java synchronization locking guava


【解决方案1】:

如果您需要这个,最好使用ConcurrentHashMap&lt;K, Set&lt;V&gt;&gt; 并手动复制多地图语义。

您也许可以创建一个扩展 MultimapMultimapView 类型并提供对 Map&lt;K, Collection&lt;V&gt;&gt; 的视图 - 我不确定是否有原因 Guava 不提供该类型(它可能效率不高?)。我在Multimaps 看到的只是复制工厂。

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多