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
synchronized(arrayList) { ... }
blokları içindeki dizi listesini işleyen kodu yerleştirerek yarış koşullarını önleyebilirsiniz.
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.
İ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.
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.
Java, "synchronized" özelliğini tanımayacaktır - "synchronized" yazılmalı. – ajb