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.
- 1. Köşeli Ayrı Ayrı Ayrı
- 2. mockito - ayrı ayrı aynı yöntemle
- 3. Oracle SQL ayrı ayrı seç
- 4. Dexpreopt ile ayrı ayrı Android modülleri oluşturma
- 5. IPython/Jupyter defterine ayrı ayrı hücre aktarma
- 6. Bir veri çerçevesini ayrı ayrı sütunlarına ayırın
- 7. Tepki Görünümü Ayrı Ayrı Olarak Nasıl Desteklenir
- 8. Kullanıcı verilerini ayrı ayrı veritabanında saklayın
- 9. Java Ayrı İki Ayrı Klavyenin Girişi
- 10. Her sıra ayrı ayrı keskin mi?
- 11. Ayrı bir iş parçacığında
- 12. ayrı şube +
- 13. Ayrı derleme
- 14. MATLAB Materyalleri ayrı ayrı ayrı alt noktalardaki veri noktalarının hareketli olarak izlenmesi
- 15. IntelliJ IDEA'da Sermaye Harfleri (Ctrl + Backspace) Tarafından Ayrı Ayrı Ayrı Silme ALET
- 16. Magento düzeni güncelleştirmelerini mağaza başına ayrı ayrı tanımlamak mümkün mü
- 17. Her resmi argümanın veri türünü neden ayrı ayrı belirtmeliyiz?
- 18. tidyr :: nasıl kullanılır, gerekli değişkenlerin sayısı bilinmiyor ayrı ayrı
- 19. iPhone Gameloop güncellemeyi konu ile ayrı ayrı gösterme
- 20. Tycho: Eklentileri ayrı ayrı oluştururken projenin diğer eklentilerine bağımlılıklar çözümlenemiyor
- 21. KVO on removeAllObjects Her Öğe için NSKeyValueChangeRemovalı Ayrı Ayrı
- 22. Her bir iş parçacığı için ayrı ayrı durum nasıl sağlanır
- 23. Sütun değerlerini ayrı ayrı birleştirmek tuhaf bir sonuç alır
- 24. Giriş etiketlerine stil uygulamak ayrı ayrı nasıl uygulanır?
- 25. QML TableView Öğesi satırlarını dinamik olarak ve ayrı ayrı değiştirme
- 26. Farklı düzeylerde dosyaları ayrı ayrı kaydetmek için java.util.logging API'sini kullanma
- 27. OpenCV, OpenCV Manager'ı ayrı ayrı kurmam gerekiyor mu?
- 28. Özel denetleme özelliklerimi tasarımcı kılavuzunda ayrı ayrı gruplama
- 29. Dizin içindeki her dizini bulun ve dizinleri ayrı ayrı depolayın.
- 30. Dizin liste değeri içeriyorsa ve ayrı olarak içeriyorsa ayrı olarak
Java, "synchronized" özelliğini tanımayacaktır - "synchronized" yazılmalı. – ajb