On Tue, Jun 8, 2010 at 5:59 PM, Paul Cowan <co...@aconex.com> wrote: > No problem. With that change, there would be a potential race condition: > > Thread 1 Thread 2 > ---------- ------------- > enter regionCachePrefetchEnabled > call ConcurrentMap.get() - get null > enter disableRegionCachePrefetch > ConcurrentMap.put(false); > exit disableRegionCachePrefetch > ConcurrentMap.put(true) > exit regionCachePrefetchEnabled > > > which means that after one (nominally 'read-only') call to > regionCachePrefetchEnabled and one call to disableRegionCachePrefetch have > completed, the value in the cache for the table is true, when it really > should be false.
Oh, I see. But that's because the regionCachePrefetchEnabled method was unnecessarily changing the Map. If the "read-only" methods like this one weren't modifying any data structure (and they don't need to), this problem wouldn't exist. Also even though ConcurrentHashSet doesn't exist, it can be implemented by storing some random, unique Object instance as the value. I think that's how HashSet is implemented: public class HashSet<E> [...] { [...] private transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); [...] public boolean add(E e) { return map.put(e, PRESENT)==null; } -- Benoit "tsuna" Sigoure Software Engineer @ www.StumbleUpon.com