मैं जावा में थ्रेड सुरक्षा तंत्र को समझने की कोशिश कर रहा हूं और मुझे कुछ मदद चाहिए।जावा में थ्रेड सुरक्षित वैश्विक चर
public class ThreadSafe {
private Executor executor = new ScheduledThreadPoolExecutor(5);
private long value = 0;
public void method() {
synchronized (this) {
System.out.println(Thread.currentThread());
this.value++;
}
}
private synchronized long getValue() {
return this.value;
}
public static void main(String... args) {
ThreadSafe threadSafe = new ThreadSafe();
for (int i = 0; i < 10; i++) {
threadSafe.executor.execute(new MyThread());
}
}
private static class MyThread extends Thread {
private ThreadSafe threadSafe = new ThreadSafe();
private AtomicBoolean shutdownInitialized = new AtomicBoolean(false);
@Override
public void run() {
while (!shutdownInitialized.get()) {
threadSafe.method();
System.out.println(threadSafe.getValue());
}
}
}
}
यहाँ मैं value
धागा सुरक्षित बनाने के लिए कोशिश कर रहा हूँ, एक समय में एक धागा द्वारा केवल पहुँचा जा करने के लिए: मैं एक वर्ग है। जब मैं इस प्रोग्राम को चला रहा हूं, तो मुझे लगता है कि value
पर एक से अधिक धागे चल रहे हैं, भले ही मैं इसे synchronized
ब्लॉक में लपेटूं। बेशक यह पाश अनंत हो जाएगा लेकिन इसकी सिर्फ एक उदाहरण है, मैं कुछ सेकंड के बाद मैन्युअल रूप से इस कार्यक्रम को रोकने के कर रहा हूँ, इसलिए मैं है:
2470
Thread[pool-1-thread-3,5,main]
2470
Thread[pool-1-thread-5,5,main]
2470
Thread[pool-1-thread-2,5,main]
अलग धागे तक पहुँचने और इस value
बदल रहे हैं। क्या कोई मुझे समझा सकता है ऐसा क्यों है? और इस वैश्विक परिवर्तनीय धागे को सुरक्षित कैसे बनाया जाए?
इस उदाहरण में लंबे समय तक स्थिर बनाने के लिए अपने इरादे नहीं था? क्योंकि किसी भी अन्य मामले में कोई थ्रेडसफ्टी मुद्दा नहीं है। –
सुनिश्चित करें कि आप मेरा उत्तर देखें। आपकी 'माई थ्रेड' श्रेणी को 'थॉट' और _should_ 'रननेबल' को लागू नहीं करना चाहिए। – Gray