Оба ваших решения работают, однако в способе реализации блокировки есть ошибка.
Сначала разница в двух подходах:
ReentrantReadWriteLock в основном используется в ситуациях, когда у вас гораздо больше операций чтения, чем операций записи, как правило, в соотношении 10 операций чтения: 1 запись. Это позволяет выполнять чтение одновременно, не блокируя друг друга, однако, когда начинается запись, все чтения будут заблокированы. Таким образом, производительность является основной причиной.
Ошибка в вашем подходе:
Объект, к которому вы привязываетесь, должен быть окончательным. В setCount () вы эффективно меняете объект, что может привести к неправильному чтению в это время.
Кроме того, никогда не подвергайте объект, на который вы блокируете. Объект, который вы блокируете, должен быть закрытым и конечным. Причина в том, что если вы случайно выставили объект, вызывающий может использовать сам возвращаемый объект для блокировки, и в этом случае вы столкнетесь с проблемами конкуренции с компонентами вне этого класса.