You're right — there should be no expectation that readers *must* pick up a change to `unsynchronizedValue`. That said, if a thread fails to pick up the change, it falls back to reading `value` (which is `volatile`), which is guaranteed to always be up to date. In our tests, something like 40% of reads picked up `unsynchronizedValue` before ever reading `value`, so to that extent (and based on other internal perf tests) the optimization appears to be valuable. In all cases `deref()` yielded the correct result.
`ReentrantReadWriteLock` is an interesting suggestion to explore — thank you!