The thing you are trying to do is called “Premature Optimization”. You don’t have a real performance problem but try to make your entire program very complicated and possibly error prone, without any gain.
The reason why you will never experience any (notable) gain lies in the way how a lock works. You can learn a lot of it by studying the documentation of the class AbstractQueuedSynchronizer
.
A Lock
is formed around a simple int
value with volatile
semantics and atomic updates. In the simplest form, i.e. without contention, locking and unlocking consist of a single atomic update of this int
variable. Since you claim that you can be sure that there will be only one thread accessing the data at a given time, there will be no contention and the lock state update has similar performance characteristics compared to your volatile boolean
attempts but with the difference that the Lock
code works reliable and is heavily tested.
The ConcurrentMap
approach goes a step further and allows a lock-free read that has the potential to be even more efficient than your volatile
read (depending on the actual implementation).
So you are creating a potentially slower and possibly error prone program just because you “feel that using many concurrent hash maps per object is heavy-handed”. The only answer can be: don’t feel. Measure. Or just leave it as is as long as there is no real performance problem.