如何使此方法线程安全?

时间:2015-05-21 18:50:09

标签: java multithreading guava

如果那是正确的话,我希望getData()是幂等的。每次调用它,无论是来自两个不同的线程,同时,串行返回相同的值。 我的主要问题是两个线程调用MyMap.getData()并且我注意到返回的映射不一致 - 现在引用代码块l.lock()' - 因为它可能被两个线程突变或者基础地图的putsgets未同步。我想知道这是否现在是线程安全的,如果没有,如何使它成为防弹。方法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); 

  }


}  

0 个答案:

没有答案