Java’da Vector ve ArrayList ikiside birbirine benzer işlemler gerçekleştirmektedir. Birbirlerinden tek farkları ise, Vector‘un thread safe olarak adlandırılmasıdır. Yani birden fazla thread içeren bir uygulamanız var ise, ve siz Vector‘un elemanlarına bunların herbirinden erişip üzerlerinde değişiklik yapıyorsanız, herhangi bir problem çıkarmayacaktır. Ancak ArrayList kullanırsanız, bu thread safe mantığını kendiniz halletmeniz gerekir.

Ama bugün başıma gelen bir problem, Vector‘un thread safe olmasına karşın, bazı kullanımlarda bu durumun değişebildiğini gösterdi. Eğer Vector tanımlamasında generic belirttiyseniz, aslında belirtmesenizde olur, belirttiğiniz generic türünde foreach ile teker teker gezip işlem yapabilirsiniz. Ancak, bu kullanım Vector’u thread safe olmaktan çıkarıyor.

Örnek vermek gerekirse, bir Swing objesinin paint metodu, onun modelindeki bir Vector‘den renk ile alakalı parametre okuduğunu düşünelim. Bu obje ekranda çiziliyken ve görünür vaziyette iken, siz gidip bu Vector üzerinde foreach ile gezip; renk parametreleriyle oynamaya kalkarsanız, yüksek ihtimal ile ConcurrentModificationException alacaksınız. Nedeni ise, sizin değişikliği yaptığınız thread ile, Swing objelerinin paint metodları (ve benzer metodların) çağırıldığı thread in farklı olması.

for(MyObject myObj : vctMyObjects) { 
    if(myObj.getIndex() == 0) { 
        vctMyObjects.remove(myObj); 
    } else { 
        myObj.setColor(Color.BLACK); 
    } 
}

Bunu çözmenin bir yolu bulunmakta. Eğer Vector’ün elemanlarını Iterator ile gezerseniz ve değişikliği Iterator’ın verdiği elementler ile yaparsanız, bu Exception’dan kaçmış olacaksınız.

Iterator<MyObject> myIterator = vctMyObjects.iterator(); 
while(myIterator.hasNext()) { 
    MyObject myObj = myIterator.next(); 
    if(myObj.getIndex() == 0) { 
        // Bu satir su andaki elemani Vector'den cikarmaya yarar 
        myIterator.remove(); 
    } else { 
        myObj.setColor(Color.BLACK); 
    } 
}