Sorry, I must have misspoken previously when I endorsed read/write locks. I don't think they're appropriate here.

Read/Write locks are expensive to acquire and release. They're appropriate when the guarded resources are blocking or slow, like a socket or file. In such cases the time spent accessing the resource dwarfs the time spent acquiring a lock.

Synchronized is more faster to acquire and release. It's appropriate when the guarded resource is very fast, like an in-memory data structure.