चेकस्टाइल इस कोड को "डबल-चेक किए गए लॉकिंग मुहावरे टूटा हुआ है" के रूप में रिपोर्ट करता है, लेकिन मुझे नहीं लगता कि मेरा कोड वास्तव में डबल-चेक लॉकिंग की समस्याओं से प्रभावित होता है।क्या यह टूटी हुई डबल चेकिंग है?
कोड उस डेटाबेस के साथ एक पंक्ति बनाने के लिए है यदि उस आईडी के साथ एक पंक्ति मौजूद नहीं है। यह एक बहु थ्रेडेड वातावरण में चलता है और मैं प्राथमिक-कुंजी-मौजूद SQL-अपवादों से बचना चाहता हूं।
छद्म कोड:
private void createRow(int id) {
Row row = dao().fetch(id);
if (row == null) {
synchronized (TestClass.class) {
row = dao().fetch(id);
if (row == null) {
dao().create(id);
}
}
}
}
मैं मानता हूँ सकता है कि यह दोबारा जांच कर ताला की तरह लग रहा है, लेकिन मैं स्थैतिक चर और लाने() और बनाने (में कोड का उपयोग नहीं कर रहा हूँ) शायद बहुत जटिल है रेखांकित और आदेश से बाहर रखा जाना चाहिए।
क्या मैं गलत हूं या चेकस्टाइल हूं? :)
धारणा है कि डीएओ सही ढंग से सिंक्रनाइज़ किया गया है गंभीर है। –
इस धारणा के साथ समस्या यह है कि डीएओ को पता नहीं है कि आप इससे क्या उम्मीद करते हैं और अगला कोड मौका आपकी उम्मीदों को बर्बाद कर सकता है ... इसलिए, मुझे लगता है कि यह जवाब गलत है * और * खतरनाक! –
क्या आप कहने का मतलब है कि डीएओ को ऑब्जेक्ट इंस्टेंस को वापस करने की उम्मीद की जानी चाहिए जो प्रारंभ नहीं हुई हैं? अगर कोई लॉक था तो क्या इससे कोई फर्क नहीं पड़ता कि क्या यह किसी भी खराब स्थिति में वस्तुओं को वापस कर सकता है? – Dustin