ReadWriteLock uses two locks. One lock for read-only operations,
another lock for write operations.
Its implementation is based on the premise that concurrent threads
do not need a lock when they want to read a value while no other
thread is trying to write.
In this implementation, read-only lock can be obtained by multiple
threads. And the implementation guarantees that all read operation
will see only the latest updated value as soon as the write lock is
released