they are not synchronized, but internal locking is used to maintain consistency between concurrent readers and writers.
Now to optimize for immutable state, as you suggested, there are 2 things you can do:
1. If you are using JBC 3.x, use MVCC. There is no cost to readers. Simple.
2. If you are using JBC 2.x, use pessimistic locking and set your isolation level to NONE. But be aware that any concurrent write that may happen could corrupt the state that readers read.