मैं एक साधारण थ्रेड-सुरक्षित कक्षा लिखना चाहता हूं जिसे एक पूर्णांक मूल्य निर्धारित करने या प्राप्त करने के लिए उपयोग किया जा सकता है।एक अस्थिर चर का उपयोग कर एक साधारण धागा-सुरक्षित वर्ग कैसे लिखें?
सबसे आसान तरीका है सिंक्रनाइज़ कीवर्ड का उपयोग करने के लिए है:
public class MyIntegerHolder {
private Integer value;
synchronized public Integer getValue() {
return value;
}
synchronized public void setValue(Integer value) {
this.value = value;
}
}
मैं भी अस्थिर का उपयोग कर की कोशिश कर सकते:
public class MyIntegerHolder {
private volatile Integer value;
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
}
अस्थिर कीवर्ड धागे से वर्ग है -साफ?
पर विचार करें घटनाओं के निम्न क्रम:
- थ्रेड एक 5 पर
- थ्रेड बी मूल्य सेट 7.
- थ्रेड सेल्सियस के लिए मूल्य सेट मूल्य पढ़ता है।
यह जावा भाषा विशिष्टता से इस प्रकार है कि
- "1" होता है-पहले "3"
- "2" होता है-पहले "3"
लेकिन मुझे नहीं लगता कि यह विनिर्देश से कैसे पालन कर सकता है कि "1" होता है- "2" से पहले मुझे संदेह है कि "1" "2" से पहले होता है।
मुझे लगता है धागा सी पढ़ सकते हैं 7 या 5. मुझे लगता है कि अस्थिर कीवर्ड के साथ वर्ग नहीं है धागा सुरक्षित और निम्न क्रम भी संभव है:
- थ्रेड एक सेट 5 पर
- थ्रेड बी मूल्य 7. के लिए मूल्य सेट
- थ्रेड सी पढ़ता 7.
- थ्रेड डी पढ़ता 5.
- थ्रेड सी धागा सुरक्षित पढ़ता 7.
- थ्रेड डी पढ़ता 5.
- ...
हूँ मैं अस्थिर साथ कि MyIntegerHolder संभालने में सही है न?
public class MyIntegerHolder {
private AtomicInteger atomicInteger = new AtomicInteger();
public Integer getValue() {
return atomicInteger.get();
}
public void setValue(Integer value) {
atomicInteger.set(value);
}
}
:
यह AtomicInteger का उपयोग करके एक धागा सुरक्षित पूर्णांक धारक बनाने के लिए संभव है?
यहाँ जावा संगामिति का एक टुकड़ा अभ्यास पुस्तक में है:
"पढ़ता है और परमाणु चर राशि एक ही स्मृति अर्थ विज्ञान के रूप में अस्थिर चर का लिखते हैं।"
क्या है थ्रेड-सुरक्षित MyIntegerHolder लिखने का सबसे अच्छा (अधिमानतः गैर-अवरुद्ध) तरीका?
यदि आपको उत्तर पता है, तो मैं जानना चाहता हूं कि आपको क्यों लगता है कि यह सही है। क्या यह विनिर्देशन का पालन करता है? यदि हां, तो कैसे?
मैं अभी भी सीख रहा हूं, अगर कोई मुझे स्पष्टीकरण दे सकता है तो यह बहुत अच्छा होगा। 'सिंक्रनाइज़' या 'अस्थिर' कीवर्ड कैसे इसे और अधिक सुरक्षित बनाते हैं? चूंकि पूर्णांक असाइनमेंट और पढ़ना स्वयं पर परमाणु है, क्या यह कुछ भी बदलता है? यह दृष्टिकोण परमाणु वृद्धि या किसी भी तरह से सेट-एंड-सेट की अनुमति नहीं देता है। धन्यवाद – Sebi
@ सेबी थ्रेड-सेफ एक ऐसा प्रोग्राम है जो दो या दो से अधिक धागे में चलता है, बिना थ्रेड के किसी दूसरे पर हस्तक्षेप करता है। आप इस समस्या को हल कर सकते हैं, एक थ्रेड दूसरे तरीकों से हस्तक्षेप कर सकता है, विभिन्न तरीकों/तकनीकों में। एक साधारण int x = x + x परमाणु प्रतीत होता है, लेकिन यह नहीं है (इसके लिए अधिक, अस्थिर और परमाणु की खोज करें)! "इसे और अधिक धागा सुरक्षित बनाने के लिए", समस्या को हल करने का एक तरीका है। इससे अधिक थ्रेड-सुरक्षित नहीं होता है, एक ही समस्या को हल करने के लिए केवल अलग-अलग कार्यान्वयन है। –
@ थुफिरहावत मुझे पता है कि थ्रेड-सुरक्षित प्रोग्राम क्या है, या उस जोड़ में लिखने से पहले कई पढ़ना शामिल है, लेकिन मुझे यकीन है कि इस वर्ग के बारे में कुछ नहीं है। मैं समझ नहीं पा रहा हूं कि एक पूर्णांक के लिए गेटर और सेटर को उजागर करने वाली कक्षा का उपयोग बाहरी रूप से बंद किए बिना थ्रेड सुरक्षा की आवश्यकता के लिए कुछ भी करने के लिए किया जा सकता है (जहां 'इंटीजर' पर्याप्त होगा)। – Sebi