views:

128

answers:

2

Hi,

I am upgrading from Google Collections 0.9 to 1.0. It seems Sets.newConcurrentHashSet() is no longer available. I was using it in the following construct:

public static <K, V> Multimap<K, V> newConcurrentMultimap()
{
    return Multimaps.newMultimap( new ConcurrentHashMap<K, Collection<V>>(), new Supplier>()
    {
        @Override
        public Collection<V> get()
        {
             return Sets.<V>newConcurrentHashSet();
         }
    } );
}

What would be the best replacement for Sets.newConcurrentHashSet() ?

Edit: The reason for this construct is to have a multimap that is safe to read and write from multiple threads. It is used in a mostly-read scenario (and will be read a lot).

regards,

Wim

+6  A: 

Sets.newConcurrentHashSet was withdrawn in 1.0rc1 (commit log). I don't know the reason for the withdrawal, but you could use the implementation yourself:

Sets.newSetFromMap(new ConcurrentHashMap<V, Boolean>());
Ben Lings
This is exactly what I have done for now. I am just wondering if it will do what I hope since the javadoc states that:"The multimap is not threadsafe when any concurrent operations update the multimap, even if map and the instances generated byfactory are." I do not like to use the synchronized wrapper, since that no longer makes it concurrent but synchronized.
festerwim
You're wondering whether it works because the javadoc tells you specifically that it doesn't work? :-)
Kevin Bourrillion
It was withdrawn in a "one step back, two steps forward" manner; since we have plans to support concurrent Sets with a decent fraction of the options you get for maps with `MapMaker`, we didn't want to also be stuck with that `newConcurrentHashSet` method for all eternity. Sorry that said functionality hasn't appeared yet.
Kevin Bourrillion
A: 

Try to use MapMaker and then use newSetFromMap()

nanda