में समवर्ती पहुंच का प्रबंधन मैं सिंगलटन सत्र बीन्स में समवर्ती प्रबंधन के बारे में एक सहकर्मी के साथ एक चर्चा में आया। मेरी समझ से, Oracle documentation पढ़ने के बाद, यदि आप @ConcurrencyManagement
एनोटेशन छोड़ देते हैं, तो यह कंटेनर-प्रबंधित समरूपता के लिए डिफ़ॉल्ट है। दस्तावेज में यह निम्नलिखित के बारे में कंटेनर से प्रबंधित सिंगलटन सत्र सेम राज्यों:सिंगलटन सत्र बीन
javax.ejb.Lock एनोटेशन और एक javax.ejb.LockType प्रकार सिंगलटन के व्यापार के तरीकों या की पहुंच स्तर निर्दिष्ट किया जाता है @ टाइमआउट विधियां
और
यदि कोई @Lock एनोटेशन सिंगलटन वर्ग पर मौजूद है, डिफ़ॉल्ट ताला प्रकार, @Lock (LockType.WRITE), सभी व्यावसायिक और समय समाप्ति के तरीकों को लागू किया जाता।
अब अगर आप @ConcurrencyManagement(ConcurrencyManagementType.BEAN)
साथ सेम व्याख्या करते हैं, तो आप यह सुनिश्चित करना कि सेम के राज्य synchronized
कीवर्ड और अन्य मानक जावा संगामिति सुविधाओं का उपयोग कर सभी ग्राहकों के पार सिंक्रनाइज़ है के लिए जिम्मेदार हैं। लेख भी कहते हैं:
डेवलपर्स जो सेम से प्रबंधित संगामिति के साथ एकमात्र बनाने , इस तरह के तुल्यकालन और अस्थिर रूप में जावा प्रोग्रामिंग भाषा तुल्यकालन पुरातन, उपयोग करने के लिए समवर्ती पहुँच के दौरान त्रुटियों को रोकने के लिए अनुमति दी जाती है।
मैं कंटेनर से प्रबंधित संगामिति पर अनुभाग में इस कहीं भी नहीं देखा था, मुझे अग्रणी विश्वास है कि अगर आप चीजों को अपने आप को सिंक्रनाइज़ करने के लिए चाहते हैं, आप @ConcurrencyManagement(ConcurrencyManagementType.BEAN)
साथ वर्ग टिप्पणी करने की जरूरत है।
मेरे सहकर्मी ने एक टिप्पणी की है कि "आदमी आप लोग कुछ अजीब चीजें करते हैं" जब उन्होंने मेरी बीन पर इस टिप्पणी को देखा, जिसने इस चर्चा को शुरू किया।
उनके किसी भी बीन्स में @ConcurrencyManagement
एनोटेशन नहीं है, लेकिन वह कक्षा में synchronized
कीवर्ड का उपयोग करता है। क्या मैं यह कहने में सही हूं कि वह जो भी बेहतर अनाज सिंक्रनाइज़ेशन कर रहा है वह व्यर्थ है, क्योंकि उसके सभी व्यावसायिक तरीकों का एक अनुमान @Lock(LockType.WRITE)
एनोटेशन है? इसका मतलब यह होगा कि यदि कोई ग्राहक अपनी विधियों में से किसी एक को कॉल करता है, तो कोई अन्य ग्राहक बीन की किसी भी विधि को कॉल नहीं कर सकता है, इसलिए विधि के भीतर स्पष्ट सिंक्रनाइज़ेशन बेकार होगा।
उदाहरण के लिए, कुछ लॉक myLock
के लिए synchronized (myLock)
में उनके व्यावसायिक तरीकों में से एक के भीतर उपयोग किया जाता है, तो उस लॉक के लिए कोई विवाद नहीं होगा क्योंकि विधियां प्रभावी ढंग से सिंक्रनाइज़ होती हैं।
मुझे सही अगर मैं गलत हूँ, लेकिन ऐसा लगता है जैसे अपने तरीके मूल रूप से इस तरह दिखेगा:, यह
public synchronized void myMethod() {
// do stuff
synchronized (lock) {
// modify mutable state
}
}
public synchronized void myOtherMethod() {
// do other stuff
synchronized (lock) {
// modify mutable state
}
}
यह मानते हुए कि lock
इस सिंगलटन सत्र सेम में बनाई गई है सिर्फ सेम भीतर परिवर्तनशील राज्य की रक्षा के लिए ऐसा लगता है कि कंटेनर-प्रबंधित समेकन का उपयोग करते समय यह किसी भी उद्देश्य की सेवा नहीं करता है।
इस में किसी भी अंतर्दृष्टि के लिए अग्रिम धन्यवाद!
मुझे विश्वास नहीं है कि यह हमारी परियोजना पर मौजूद है। उन्होंने कहा, "मैं वर्षों से ऐसा कर रहा हूं, और यह ठीक काम करता है", लेकिन ऐसा प्रतीत नहीं हुआ कि वह समझ रहा था कि मैं क्या कह रहा था। यह ठीक काम करेगा, लेकिन यह मानते हुए कि मैं जो पढ़ रहा हूं वह सही है, उसके 'सिंक्रनाइज़ किए गए' ब्लॉक केवल अनावश्यक होंगे और थ्रूपुट में सुधार नहीं करेंगे। –
मैं भी वास्तव में अपने कोड का परीक्षण करने के लिए प्रेरित हूं और देख रहा हूं कि उसका सिंक्रनाइज़ेशन वास्तव में कुछ कर रहा है, लेकिन मेरे पास बहुत कुछ करना है ... शायद जब मुझे कुछ खाली समय मिल जाए :) –