Обычно весь класс имеет специфическую семантику, ориентированную на многопоточность, например, HashMap
не является потокобезопасным, в то время как ConcurrentHashMap
. Это особенно важно, если вы создаете библиотеку, люди могут обойти ваш дизайн, вызвав nonConcurrentMethod()
из нескольких потоков.
IMO, если вы не можете разделить Clazz
на два отдельных класса с различной семантикой, ориентированной на многопотоковое исполнение, было бы разумно сделать nonConcurrentMethod()
поточно-безопасным. В случае, если nonConcurrentMetho()
вызывается из нескольких потоков, производительность будет ухудшаться, но правильность будет сохранена, надеясь избежать трудностей при поиске ошибок.
Вы можете попробовать внутреннюю блокировку, которая, будем надеяться, не будет слишком дорогой из-за смещенной блокировки, оптимизирующей ее при получении блокировки из одного потока:
private final Object lock = new Object();
public int nonConcurrentMethod() {
synchronized(lock) {
...reinitialize the map...change references...
counter++;
return array[counter];
}
}
Убедитесь, что хотя бы одно из полей Clazz
имеет значение final
, чтобы обеспечить безопасную публикацию .