Add an instantiation micro-benchmark

Signed-off-by: Robert Varga <robert.varga@pantheon.sk>
Optimize the use of AtomicReferenceFieldUpdaters

Benchmarks indicate that instatiating the updaters takes ~92% of the CPU
time required to initialize a TrieMap instance.

TrieMap.inodeupdater is an unused per-object updater, which has its
equivalent in INodeBase.updater.

rtupd is an unused istance, so we can freely remove it, lowering the
memory cost of a TrieMap just a tiny bit.

Finally, we centralize the allocation of rootupdater -- instead of
allocating it over and over again, we have a single instance which we
share.

Signed-off-by: Robert Varga <nite@hq.sk>
Improve serialization performance

Couple of improvements to the serialization strategy:
- emit the fact that the map is read-only, so we preserve that trait
- write out the size and entries ourselves, not via an intermediate
  HashMap()

The read path now takes these changes into account and resets the
rootupdater after deserialization is done back to null.

Signed-off-by: Robert Varga <robert.varga@pantheon.sk>
Make KEY_ABSENT and KEY_PRESENT constants

They were just missing the final keyword.

Signed-off-by: Robert Varga <robert.varga@pantheon.sk>
Make hash/equality function final

Removes duplicate fields and makes the equivalent methods final. Also
marks things that we take care of as transient, thus allowing us to
reuse the JVM magic in serialization.

Signed-off-by: Robert Varga <robert.varga@pantheon.sk>
Rework the read-only handling

Instead of using the updater reference as the indicator of read-only
views, add an explicit boolean. Thus all instances reuse a single
updater reference, but still guard access to it via an explicit check.

This changes the behavior a bit: instead of throwing NPE on read-only
views, we throw IllegalStateException. The reason for that is that we
should have caught the attempt in the MAP API functions.

Signed-off-by: Robert Varga <robert.varga@pantheon.sk>
Detect attempts to modify read-only view

Adds explicit checks for read-only snapshot before attempting to perform
a modification operation. As per ConcurrentMap/Iterator interface
specification, throw an UnsupportedOperationException if such an attempt
is made.

Signed-off-by: Robert Varga <robert.varga@pantheon.sk>