Let's say I have a Concurrent Map that is high-read, low-write, and needs to store application data:
ConcurrentMap<UUID, Data> map = new ConcurrentHashMap<UUID, Data>();
Then, during startup and through user input, data is added to the map:
public void createData(Data newData) {
map.put(newId, newData); // etc...
}
If I then need to change the data, should I:
A) Make the Data class objects immutable, and then conduct a put operation every time a change is needed for a Data object:
public void changeData(UUID oldId, Foo newInfo) {
Data oldData = map.get(oldId);
Data newData = new Data(oldData, newInfo); // Constructor for demo only
map.put(newData);
saveToDatabase(newData);
}
B) Make the Data class objects mutable yet thread-safe with volatile fields, atomic references or final concurrent fields, and simply modify the object as needed:
public void changeData(UUID oldId, Foo newInfo) {
Data data = map.get(id);
data.changeSomething(newInfo);
saveToDatabase(data);
}
C) None of the above
The compute(Key, BiFunction) method of ConcurrentHashMap class is used to compute a mapping for the specified key and its current mapped value (or null if there is no current mapping is found). This method is used to atomically update a value for given key in ConcurrentHashMap.
Concurrent hashmap allows concurrent read and write. So performance is relatively better than a synchronized map. Multiple threads can't access the map concurrently. So, performance is relatively less than a concurrent hash map.
The underlined data structure for ConcurrentHashMap is Hashtable. ConcurrentHashMap class is thread-safe i.e. multiple threads can operate on a single object without any complications.
ConcurrentHashMap is a subclass of HashMap and is designed to be used in multi-threaded environments. It maintains a configurable concurrency level (default value of 16), which can be specified while creating the map.
A) is the better option, for two reasons:
volatile
) works against you in this case.ConcurrentHashMap
.If you have an option of making an immutable class, you would be much better off with your implementation #A
: in-place modifications are significantly harder to implement and maintain.
Sometimes going the immutable route may not be an option, because of the need to make frequent modifications to a relatively large object. In this case you may want to reconsider the application of the concurrent hash map to your design, because the fact that it is synchronized does not give you too much an advantage.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With