2016-04-10 24 views
0

3 iş parçacığı olan bir programım var (ana iş parçacığı hariç). İlk iş parçacığı pencereden bir nesneyi hareket ettirir, ikinci iş parçacığı nesne çarpışmalarını denetler ve üçüncüsü düzenli aralıklarla nesnelerin ArrayListine eklenir. Bu parçacıkların üçü de aynı nesne listesini manipüle ediyor (İlk 2 aslında listeyi değiştirmiyor olsa da, sadece içindeki nesneler). Ancak, listeye eklemek istediğimiz konu bir nesne eklemeyi denediğinde bir hata alıyorum. Bir ArrayList'i farklı bir iş parçacığından değiştirmek mümkün mü?Ayrı dişliden ArrayList'e Ekleme

cevap

2

synchronized(arrayList) { ... } blokları içindeki dizi listesini işleyen kodu yerleştirerek yarış koşullarını önleyebilirsiniz.

2

Evet, diziyi birden çok iş parçacığında işleyebilirsiniz. Java documentation'da, synchronized anahtar sözcüğünü kullanarak nesnelere ilişkin daha fazla bilgi edinebilirsiniz.

0

İlk olarak, çok iş parçacıklı bir uygulamanız varsa, ArrayList yerine Vector gibi bir şey kullanmayı tercih edin, çünkü ArrayList, iş parçacığı için güvenli sayılmaz. Ayrıca

, Bir synchronized yöntemi yapmak kullanılmış ve buna işlemleri gerçekleştirmek veya synchronized blok kullanabilirsiniz , eşzamanlılık işlemek için.

+1

Java, "synchronized" özelliğini tanımayacaktır - "synchronized" yazılmalı. – ajb

2

ArrayList ile ilgili özel bir şey yoktur; bu, birden çok iş parçacığı tarafından okunmasını ve yazılmasını engeller. Bu uygulama senkronize olmadığını

Not: Ancak, warning in the Javadoc not edin. Birden çok iş parçacığı bir ArrayList örneğine eşzamanlı olarak erişirse ve iş parçacıklarının en az biri listeyi yapısal olarak değiştirirse, dışsal olarak eşitlenmelidir. (Bir yapısal değişiklik, bir veya daha fazla elemanı ekleyen veya silen veya destek dizisini açıkça yeniden boyutlandıran herhangi bir işlemdir; yalnızca bir öğenin değerini ayarlamak yapısal bir değişiklik değildir.) Bu, tipik olarak, doğal olarak kapsülleyen bazı nesneler üzerinde eşitleme ile gerçekleştirilir. liste. Böyle bir nesne yoksa liste, Collections.synchronizedList yöntemini kullanarak "sarılmış" olmalıdır. Bu en iyi listeye yanlışlıkla Eşitlenmemiş erişimi engellemek için, oluşturma zamanında yapılır:

List list = Collections.synchronizedList(new ArrayList(...)); 

Ayrıca Synchronization Tutorial içinden okunmaya değerdir.

İlgili konular