जब आप एक NoSuchElementException
तो यह हो सकता है क्योंकि ठीक से सिंक्रनाइज़ किया जा रहा नहीं की हो। उदाहरण के लिए: आप it.hasNext()
साथ जाँच कर रहे हैं अगर एक तत्व सूची में है और बाद में it.next()
के साथ लाने के लिए कोशिश कर रहा। यह तब विफल हो सकता है जब तत्व को बीच में हटा दिया गया है और यह तब भी हो सकता है जब आप संग्रह API के सिंक्रनाइज़ संस्करणों का उपयोग करते हैं।
तो आपकी समस्या को वास्तव में ConcurrentLinkedQueue
पर जाने के साथ हल नहीं किया जा सकता है। आप एक अपवाद नहीं मिल सकता है लेकिन आप के लिए तैयार रहना है कि null
भी दिया जाता है जब आप से पहले जाँच की है कि यह खाली नहीं है है। (यह अब भी वही त्रुटि है, लेकिन कार्यान्वयन अलग है।) यह रूप में लंबे समय के लिए अपने कोड खालीपन और तत्व वही सिंक्रनाइज़ दायरे में पुन: प्राप्त करने के लिए चेक होने में कोई उचित तुल्यकालन है के रूप में सच है।
एक अच्छा मौका है कि आप NoSuchElementException
का व्यापार NullPointerException
के बाद व्यापार करने के लिए करते हैं।
यह प्रदर्शन के बारे में आपके प्रश्न को सीधे संबोधित करने वाला उत्तर नहीं हो सकता है, लेकिन ConcurrentLinkedQueue
पर जाने के कारण के रूप में लिंक्डलिस्ट में NoSuchElementException
होने के कारण थोड़ा अजीब लगता है।
संपादित
टूटा कार्यान्वयन के लिए कुछ छद्म कोड:
//list is a LinkedList
if(!list.isEmpty()) {
... list.getFirst()
}
उचित सिंक के लिए कुछ छद्म कोड:
//list is a LinkedList
synchronized(list) {
if(!list.isEmpty()) {
... list.getFirst()
}
}
"टूटे" सिंक के लिए कुछ कोड (करता है इरादे के रूप में काम नहीं करते हैं)। यह शायद सिंक्रनाइज़ेशन से छुटकारा पाने की उम्मीद में लिंक्डलिस्ट से सीएलक्यू तक सीधे स्विच करने का नतीजा है।
//queue is instance of CLQ
if(!queue.isEmpty()) { // Does not really make sense, because ...
... queue.poll() //May return null! Good chance for NPE here!
}
कुछ उचित कोड:
//queue is instance of CLQ
element = queue.poll();
if(element != null) {
...
}
या
//queue is instance of CLQ
synchronized(queue) {
if(!queue.isEmpty()) {
... queue.poll() //is not null
}
}
स्रोत
2011-09-06 08:42:32
बहुत http://stackoverflow.com/questions/4724995/lock-free-concurrent-linked-list- के समान इन-जावा –