如果那是正确的话,我希望getData()
是幂等的。每次调用它,无论是来自两个不同的线程,同时,串行返回相同的值。
我的主要问题是两个线程调用MyMap.getData()
并且我注意到返回的映射不一致 - 现在引用代码块l.lock()
' - 因为它可能被两个线程突变或者基础地图的puts
和gets
未同步。我想知道这是否现在是线程安全的,如果没有,如何使它成为防弹。方法getData
基本上
这是一些伪java-guava代码:
public class MyMap extends Map {
final Lock l = new ReentrantLock();
public Table<S, I, F> getData(Iterable<S> ss, Iterable<B> bs) {
final Table<S, I, F> t = HashBasedTable.create();
final ImmutableSet.Builder<B> builder = ImmutableSet.builder();
for (B b : bs) {
builder.add(b)
}
final ImmutableSet<B> finalBs = builder.build();
for (A a : as) {
final ImmutableTable<I, I, F> im = get(a);
l.lock();
try {
if (im == null) {
final Table<I, I, F> mutableT = HashBasedTable.create()
... populate table ...
put(a, ImmutableTable.copyOf(mutableT);
}
} finally {
l.unlock();
}
for (Map.Entry<I, I, F> entry : im) {
final A a = ... some simple transform of key ...
for (Map.Entry<I, F> entry2 : entry.getValue().entrySet()) {
if (finalBs.contains(entry.B) {
t.put(a, entry.B, entry.C)
}
}
}
}
return ImmutableTable.copyOf(t);
}
}