如何在 guava 中实现单元级锁定 table

how to achieve cell level lock in guava table

我在内存缓存中使用 guava table。我不想锁定整个 table 以进行更新,而只想锁定那个单元格。

private Table<String, String, State> cache = HashBasedTable.create();

 public void updateStateCache(String switchOid, String entityOid, State state) {
        synchronized ((switchOid+entityOid).intern()) {
            this.cche.put(switchOid, entityOid, state);
        }
    }
private Map<C, V> getOrCreate(R rowKey) {
    Map<C, V> map = backingMap.get(rowKey);
    if (map == null) {
      map = factory.get();
      backingMap.put(rowKey, map);
    }
    return map;
  }
  @CanIgnoreReturnValue
  @Override
  public V put(R rowKey, C columnKey, V value) {
    checkNotNull(rowKey);
    checkNotNull(columnKey);
    checkNotNull(value);
    return getOrCreate(rowKey).put(columnKey, value);
  }

线程安全在处理 map == null 情况时受到损害。即,如果我们同时使用 (switOid+enityOid).intern() 进行同步,则两个或多个线程 [例如 (switch1 + interface1) 和 (switch1 + interface2) ]。可以进入该块并为 columnKey 创建一个新条目,最后一个执行 backingMap.put(rowKey, map) 将最终覆盖 backingMap 中 columnKey 的条目,这将导致丢失操作由其他线程执行。特别是在多线程环境下这个操作的结果是非确定性的,相当于说这个操作不是线程安全的

Is a Guava Table thread safe when its backing maps are thread safe?