Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does java have a "LinkedConcurrentHashMap" data structure?

I need a data structure that is a LinkedHashMap and is thread safe.

How can I do that ?

like image 841
Peter Lee Avatar asked Sep 08 '09 04:09

Peter Lee


People also ask

What is synchronized Map in Java?

The synchronizedMap() method of java. util. Collections class is used to return a synchronized (thread-safe) map backed by the specified map. In order to guarantee serial access, it is critical that all access to the backing map is accomplished through the returned map.

What is a LinkedHashMap Java?

The LinkedHashMap class of the Java collections framework provides the hash table and linked list implementation of the Map interface. The LinkedHashMap interface extends the HashMap class to store its entries in a hash table. It internally maintains a doubly-linked list among all of its entries to order its entries.

Is LinkedHashMap concurrent?

Concurrency Just like HashMap, LinkedHashMap implementation is not synchronized. So if you are going to access it from multiple threads and at least one of these threads is likely to change it structurally, then it must be externally synchronized. It's best to do this at creation: Map m = Collections.

Does ConcurrentHashMap maintain insertion order?

ConcurrentHashMap and HashTable do not preserve the insertion order of mappings in the map. Also, the addition and removal of any element might change its iteration order. On the other hand, Collections. SynchronizedMap() is backed by the specified map and retains the insertion order of the map.


2 Answers

You can wrap the map in a Collections.synchronizedMap to get a synchronized hashmap that maintains insertion order. This is not as efficient as a ConcurrentHashMap (and doesn't implement the extra interface methods of ConcurrentMap) but it does get you the (somewhat) thread safe behavior.

Even the mighty Google Collections doesn't appear to have solved this particular problem yet. However, there is one project that does try to tackle the problem.

I say somewhat on the synchronization, because iteration is still not thread safe in the sense that concurrent modification exceptions can happen.

like image 105
Yishai Avatar answered Oct 12 '22 23:10

Yishai


There's a number of different approaches to this problem. You could use:

Collections.synchronizedMap(new LinkedHashMap()); 

as the other responses have suggested but this has several gotchas you'll need to be aware of. Most notably is that you will often need to hold the collections synchronized lock when iterating over the collection, which in turn prevents other threads from accessing the collection until you've completed iterating over it. (See Java theory and practice: Concurrent collections classes). For example:

synchronized(map) {     for (Object obj: map) {         // Do work here     } } 

Using

new ConcurrentHashMap(); 

is probably a better choice as you won't need to lock the collection to iterate over it.

Finally, you might want to consider a more functional programming approach. That is you could consider the map as essentially immutable. Instead of adding to an existing Map, you would create a new one that contains the contents of the old map plus the new addition. This sounds pretty bizarre at first, but it is actually the way Scala deals with concurrency and collections

like image 27
hohonuuli Avatar answered Oct 12 '22 23:10

hohonuuli