2010-12-20 6 views
10

मान लीजिए मैं निम्नलिखित वर्ग है:अमरूद-पुस्तकालय: Iterators.cycle() थ्रेड-सुरक्षित है?

public class Foo { 

    private List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5); 
    private Iterator<Integer> iterator = Iterators.cycle(list); 

    public void bar(){ 
     Integer value = iterator.next(); 
     doSomethingWithAnInteger(value); 
    } 
} 

फू का एक उदाहरण दो धागे से एक साथ acessed है, तो मुझे लगता है कि प्रत्येक थ्रेड iterator.next() से एक अलग मूल्य हो जाता है की जरूरत है। क्या bar() विधि को सिंक्रनाइज़ किया जाना है? या iterator.next() धागा-सुरक्षित होने की गारंटी है?

इस उदाहरण में, मैं अंतर्निहित Iterable के रूप में एक ArrayList का उपयोग कर रहा हूँ। चक्रीय पुनरावर्तक की थ्रेड-सुरक्षा विशिष्ट पुनरावर्तनीय कार्यान्वयन पर निर्भर करती है?

धन्यवाद।

उत्तर

11

गुवा में बहुत ज्यादा कुछ भी थ्रेड सुरक्षित होने की गारंटी नहीं है जब तक कि इस तरह से दस्तावेज न हो।

आपको पूरे बार विधि को सिंक्रनाइज़ करने की आवश्यकता नहीं है, लेकिन आपको सिंक्रनाइज़ किए गए ब्लॉक में iterator.next() को कॉल को लपेटना चाहिए। उदाहरण के लिए:

public void bar(){ 
    Integer value; 
    synchronized (iterator) { 
     value = iterator.next(); 
    } 
    doSomethingWithAnInteger(value); 
} 
6

Iterators.cycle(final Iterable<T> iterable) की source code पर एक नजर डालें। भले ही अंतर्निहित इटरेटर थ्रेड-सुरक्षित है, यह साइक्लिंग रैपर की तरह दिखता नहीं है। यह जावा की नीति के साथ संगत है जो इटैरेटर्स को स्पष्ट रूप से सिंक्रनाइज़ नहीं करता है।

संबंधित मुद्दे