मैं कुछ हद तक वास्तविक दुनिया परिदृश्य की नकल करने के लिए निम्नलिखित कोड के साथ आया था।
100 कार्य समानांतर में चल रहे हैं और वे मुख्य कार्यक्रम में अपनी पूर्ण स्थिति अपडेट करते हैं। मैं कार्य पूरा होने की प्रतीक्षा करने के लिए एक काउंटरडाउन लांच का उपयोग करता हूं।
import java.util.concurrent.*;
import java.util.*;
public class Runner {
// Should be replaced with Collections.synchronizedList(new ArrayList<Integer>())
public List<Integer> completed = new ArrayList<Integer>();
/**
* @param args
*/
public static void main(String[] args) {
Runner r = new Runner();
ExecutorService exe = Executors.newFixedThreadPool(30);
int tasks = 100;
CountDownLatch latch = new CountDownLatch(tasks);
for (int i = 0; i < tasks; i++) {
exe.submit(r.new Task(i, latch));
}
try {
latch.await();
System.out.println("Summary:");
System.out.println("Number of tasks completed: "
+ r.completed.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
exe.shutdown();
}
class Task implements Runnable {
private int id;
private CountDownLatch latch;
public Task(int id, CountDownLatch latch) {
this.id = id;
this.latch = latch;
}
public void run() {
Random r = new Random();
try {
Thread.sleep(r.nextInt(5000)); //Actual work of the task
} catch (InterruptedException e) {
e.printStackTrace();
}
completed.add(id);
latch.countDown();
}
}
}
जब मैंने आवेदन 10 बार और कम से कम 3 से 4 बार चलाया तो कार्यक्रम ने पूर्ण कार्यों की सही संख्या मुद्रित नहीं की थी। आदर्श रूप से इसे 100 प्रिंट करना चाहिए (यदि कोई अपवाद नहीं होता है)। लेकिन कुछ मामलों में यह 98, 99 आदि प्रिंटिंग कर रहा था
इस प्रकार यह साबित करता है कि ऐरेलिस्ट के समवर्ती अपडेट सही परिणाम नहीं देंगे।
यदि मैं सिंक्रनाइज़ संस्करण के साथ ArrayList को प्रतिस्थापित करता हूं, तो प्रोग्राम सही परिणाम आउटपुट करता है। मुझे बेहतर यह है, क्योंकि के रूप में
Collections.synchronizedList(new ArrayList());
या
new Vector();
synchronizedList
:
स्रोत
2015-01-18 05:20:13
"यह मेरा अनुभव रहा है कि दोनों वस्तुओं को ठीक जोड़ा गया है" बस यह इंगित करना चाहते हैं कि यह बहुत ही भाग्यशाली है। संभावित रूप से ArrayList के साथ डेटा भ्रष्टाचार के मुद्दे के लिए खिड़की बहुत छोटी है, लेकिन यह अभी भी –
सही है, और यह मेरी तरह का मुद्दा है। अधिकांश मामलों में कोई समस्या नहीं होगी; लेकिन हम ज्यादातर मामलों में कार्यक्रम नहीं करते हैं। इस प्रकार मैंने ArrayList का उपयोग करने के खिलाफ दृढ़ता से क्यों अनुशंसा की। – derivation