Вот код, я наткнулся на:Должны ли быть синхронизированы операции с ThreadLocal?
class TransactionContextHolder {
private static final ThreadLocal<TransactionContext> currentTransactionContext = new NamedInheritableThreadLocal<TransactionContext>(
"Test Transaction Context");
static TransactionContext getCurrentTransactionContext() {
return currentTransactionContext.get();
}
static void setCurrentTransactionContext(TransactionContext transactionContext) {
currentTransactionContext.set(transactionContext);
}
static TransactionContext removeCurrentTransactionContext() {
synchronized (currentTransactionContext) {
TransactionContext transactionContext = currentTransactionContext.get();
currentTransactionContext.remove();
return transactionContext;
}
}
}
currentTransactionContext поле имеет тип ThreadLocal и это единственное поле в классе.
Мне кажется, что синхронизация здесь не нужна, потому что значение, хранящееся в ThreadLocal, связано с конкретным потоком и, следовательно, не является общим состоянием. Кроме того, я думаю, что это влияет на производительность, поскольку currentTransactionContext сам по себе, и только один поток разрешен для входа в блок, в то время как многие могут делать это параллельно, не влияя на правильность.
Нужна ли синхронизация здесь?
Просто убедитесь, что 'currentTransactionContext.initialValue' (или даже геттер) не имеет общее состояние, а затем вы должны быть отлично с удалением синхронизации. –