यहाँ कोड मैं भर में ठोकर खाई है:थ्रेडलोकल पर संचालन सिंक्रनाइज़ किया जाना है?
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 की है और यह कक्षा में केवल क्षेत्र है।
ऐसा लगता है कि सिंक्रनाइज़ेशन की आवश्यकता नहीं है क्योंकि थ्रेडलोकल में संग्रहीत मान विशेष थ्रेड से जुड़ा हुआ है और इस प्रकार यह एक साझा स्थिति नहीं है। इसके अलावा मुझे लगता है कि यह प्रदर्शन को प्रभावित करता है क्योंकि वर्तमान ट्रांज़ेक्शन कॉन्टेक्स्ट स्वयं साझा किया जाता है और ब्लॉक में प्रवेश करने के लिए केवल एक थ्रेड को अनुमति दी जाती है जबकि कई लोग समानता को प्रभावित किए बिना समानांतर में कर सकते हैं।
क्या सिंक्रनाइज़ेशन की आवश्यकता है?
बस सुनिश्चित करें कि 'currentTransactionContext.initialValue' (या यहां तक गेटर) एक साझा राज्य नहीं है हो सकता है और उसके बाद आप होना चाहिए सिंक्रनाइज़ेशन को हटाने के साथ ठीक है। –