SORU
25 NİSAN 2013, PERŞEMBE


Doğrudan erişimli veri yapısının Java

Şu durum var:

  1. Sadece ( ben sadece şimdiye kadar uzatılabilir veri yapısı kuyruk) şeyler ekleyin
  2. Zaten var olan takip edebilmek için istiyorum (bir dizin var, ve ben başlamak mümkün olmak istiyorum ideal olarak görülen listeyi tekrar bu özel öğe) geçme
  3. Hiç engelliyor okur ve ek istiyorum sadece tek sıra kuyruk yerine kilitlemek için yeni bir unsur daha bütün sıra

Bu ağır birden çok iş parçacığı tarafından değiştirilmiş olan bir yapıdır.

Bunun için en iyi veri yapısı ne olurdu?

ArrayList. Bu doğrudan son öğe dizini kullanarak görülen erişebilmeleri için ideal olacaktır, ama eşzamanlı değişiklikler, özel durumlar yol açar. ben gelebilirim bu senkronize, ama olacak gibi önlemek için kilitleme (veya herhangi bir kilitleme dışında son öğe olarak tek bir yerde olabilir eşzamanlı yazıyor Ekle yeni unsurlar)

ConcurrentLinkedQueue. Bu eşzamanlılık benim sorunu çözmek istiyorsunuz, ama bir tamsayı dizin yerine yineleme geçerli konumunu saklamak zorunda olacağı sorunu var. Bu yineleyici oluşturulduktan sonra listeye eklenen yeni nesneler iade garantisi olmayan zayıf tutarlı bir yineleyici döndürür sorunu var (kaynak: javadoc)

ConcurrentHashMapanahtarları olarak dizin. Bu şekilde ben access veri karşılık gelen doğru dizin doğrudan, ama sorun orada olmayan bir "getNext" operatör olduğunu ifade eder benim için verimli çapraz elemanları dizin, dizin 1, vb

VektörlerBu eşzamanlı değişiklik istisna atar ve doğrudan erişmek için izin vermez böyle bir şeye izin veren benim, en büyük sorunları çözecek. Ancak bu yöntemler senkronize göz önüne alındığında, performans arraylists göre kötüdür. Verilen bu sadece hayal uzatmak yapısı ve kayıt ekleme ortada, ben isteksiz gitmek için bu ağır çözüm, nerede okur da acı bir performans isabet (oysa verilen usecase, dizinin bir elemanı hiçbir zaman gerçekten değişir, bu yüzden hiç gerek yok senkronize okur değil kuyruk)

Özel bir veri yapısı: tutmak bir dizi nesneleri istiyorum saklamak ve bir işaretçi için kuyruk bu dizi (son öğe kümesi), eklerken yeni bir nesne, kilit kuyruğu ve sivri nesne ile kuyruk. Nesnenin geçerli boyutu aştığında, kilitleme yeniden boyutlandırma işlemi için.

En iyi strateji ne olurdu/ daha etkili bir diğer uygulama?

CEVAP
25 NİSAN 2013, PERŞEMBE


CopyOnWriteArrayList yapı sorunu (java.çözebilir açıklama.eş zamanlı).

  • CopyOnWriteArrayLists tüm mutative işlemleri listenin bir kopyasını oluşturarak gerçekleştirilir için güvenli iplik.

  • ConcurrentModificationException sorunu dizi yineledi süre değiştirmez çünkü önlenir. Bu yüzden snapshot style iterator adı verilen yineleyici oluşturulduğunda dizinin devlet için bir başvuru kullanır.

  • Eğer çok fazla okur yazar daha varsa, CopyOnWriteArrayList, yoksa 4 ** kullanın.

  • Vector CopyOnWriteArrayList yazma (kopyalama nedeniyle) için daha uzun bir gecikme olduğunda her işlem için küçük bir senkronizasyon gecikmesi ama okur için hiçbir gecikme söz konusudur.

  • Vector (yani yazma işlemleri aynı anda idam edilemez), CopyOnWriteArrayList gelmez yineleme zaman açık senkronizasyon gerektirir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3DS Max Tutorials

    3DS Max Tuto

    4 AĞUSTOS 2013
  • engineerguy

    engineerguy

    10 Ocak 2010
  • LearnKey

    LearnKey

    19 AĞUSTOS 2008