如何在 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);
}
}
- 它会保证单元级锁定还是我必须锁定整个 table
在更新时?
- 这是正确的做法吗,因为
string.itern()
不推荐?
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?
我在内存缓存中使用 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);
}
}
- 它会保证单元级锁定还是我必须锁定整个 table 在更新时?
- 这是正确的做法吗,因为
string.itern()
不推荐?
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?