से ट्रीसेट बनाने का अपवाद आम तौर पर, समवर्ती संग्रह फिर से सुरक्षित होते हैं; जावाडोक के मुताबिक: 'इटरेटर कमजोर रूप से सुसंगत हैं, सेटर की स्थिति को प्रतिबिंबित करने वाले तत्वों को किसी बिंदु पर या फिर इटरेटर के निर्माण के बाद दर्शाते हैं। वे ConcurrentModificationException फेंक नहीं देते हैं, और अन्य परिचालनों के साथ एक साथ आगे बढ़ सकते हैं। ' हालांकि, इस पर विचार करें:समवर्ती रूप से संशोधित ConcurrentSkipListSet
import java.util.Random;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentSkipListSet;
public class ConcurrencyProblem {
private static volatile boolean modifierIsAlive = true;
public static void main(String[] args) {
final ConcurrentSkipListSet<Integer> concurrentSet = new ConcurrentSkipListSet<>();
Thread modifier = new Thread() {
private final Random randomGenerator = new Random();
public void run() {
while (modifierIsAlive) {
concurrentSet.add(randomGenerator.nextInt(1000));
concurrentSet.remove(randomGenerator.nextInt(1000));
}
};
};
modifier.start();
int sum = 0;
while (modifierIsAlive) {
try {
TreeSet<Integer> sortedCopy = new TreeSet<>(concurrentSet);
// make sure the copy operation is not eliminated by the compiler
sum += sortedCopy.size();
} catch (RuntimeException rte) {
modifierIsAlive = false;
rte.printStackTrace();
}
}
System.out.println("Dummy output: " + sum);
}
}
उत्पादन
java.util.NoSuchElementException
at java.util.concurrent.ConcurrentSkipListMap$Iter.advance(ConcurrentSkipListMap.java:2299)
at java.util.concurrent.ConcurrentSkipListMap$KeyIterator.next(ConcurrentSkipListMap.java:2334)
at java.util.TreeMap.buildFromSorted(TreeMap.java:2559)
at java.util.TreeMap.buildFromSorted(TreeMap.java:2547)
at java.util.TreeMap.buildFromSorted(TreeMap.java:2579)
at java.util.TreeMap.buildFromSorted(TreeMap.java:2579)
at java.util.TreeMap.buildFromSorted(TreeMap.java:2579)
at java.util.TreeMap.buildFromSorted(TreeMap.java:2579)
at java.util.TreeMap.buildFromSorted(TreeMap.java:2579)
at java.util.TreeMap.buildFromSorted(TreeMap.java:2579)
at java.util.TreeMap.buildFromSorted(TreeMap.java:2579)
at java.util.TreeMap.buildFromSorted(TreeMap.java:2504)
at java.util.TreeMap.addAllForTreeSet(TreeMap.java:2462)
at java.util.TreeSet.addAll(TreeSet.java:308)
at java.util.TreeSet.<init>(TreeSet.java:172)
at mtbug.ConcurrencyProblem.main(ConcurrencyProblem.java:27)
Dummy output: 44910
अगर यह एक बग या एक विशेषता है मैं सोच रहा हूँ है; हमें एक ConcurrentModificationException नहीं मिला, लेकिन फिर भी, पुनरावृत्ति के बारे में ध्यान रखना (सिंक्रनाइज़ किए गए ब्लॉक या अन्यथा वापस गिरना) ConcurrentSkipListSet/Map के उद्देश्य को हरा देता है। मैं जावा 7 और 8 दोनों के साथ इसे पुन: पेश करने में सक्षम हूं (वर्तमान में, मेरे लिनक्स बॉक्स पर 8u72)।
प्रति जावाडोक, iterators और spliterators 'ConcurrentSkipListSet' द्वारा लौटाए गए सभी [दुर्बलता से संगत] (हैं http://stackoverflow.com/questions/20142493/fail-safe-iterators-and -weakly-संगत-iterators)। –