2011-03-02 34 views
11

Diziyi nasıl uçucu hale getiririm? Çünkü anlamaya başladığım gibi, bir dizi uçucu hale getirmek güvensiz mi? Bir dizi uçucu bildirmek, alanlarına uçucu erişim sağlama VERMEZ.Java uçucu dizisi?

+2

http: //jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html –

cevap

13

referansın kendisini uçucu olduğunu beyan ediyorsun, unsurlar değil. Başka bir deyişle, uçucu elemanlar kümesini değil, uçucu bir dizi unsurunu açıklıyorsunuz demektir. Burada çözüm, tamsayı kullanmak istediğinizde AtomicIntegerArray kullanmaktır. bir başka yolu (ama biraz çirkin) bir alanı düzenleme diziye referansı her defasında yeniden yazmak olduğunu

yapmanız (i ... dedi çirkin olarak)

arr = arr; 

+2

Uçucu olan elementlerin elementlerin atomik olmaları ile aynı olduğunu düşünmüyorum. – Blindy

+0

Haklısınız, “uçucu”, önceden var olan ilişkiyi garanti etmekle ilgilidir. – mike

6

tarafından AtomicLongArray, AtomicIntegerArray, AtomicReferenceArray (java.util.concurrent.atomic). Java'daki nesneler

1

DÜZENLEME: dizileri. Bu nesneyi referansı uçucu hale getirirseniz, diziye referansı değiştirirseniz bunu diğer iş parçacıklarına görünür hale getirir. Bununla birlikte, bu, dizi değerlerinin kendileri için geçerli değildir.

Java bellek modelinin daha iyi bir şekilde ayarlanması, aslında Atomic * Array olmadan etrafta gezinme olasılığı vardır. Uçucu için oldu-öncesi ilişkiyi kullanarak okur ve normal yazma mümkün kılar: iplik A bazı uçucu olmayan malzeme ve iplik B uçucu şeyler değişiklikleri görmek için garanti edilir, sonra uçucu değişken yazar

eğer aynı zamanda, ancak sadece iplik B, önce uçucu değişkenini okursa. ayrıca bkz: diziler için Happens-before relationships with volatile fields and synchronized blocks in Java - and their impact on non-volatile variables?

, bu şu anlama gelir: Eğer dizisine yazmasını sonra , bazı uçucu durum değişkeni yazma (yazma aslında uçucu durum değişkeni değiştirir emin olun!) Eğer diziden okuduğunuzda , önce değişken durum değişkenini okuyun ve ardından diziye erişin. Uçucu okuma, tüm diğer yazıları da, daha önce olduğu sürece görünür yapmalıdır. Özgün başvuru arr=arr yazımı aslında yardımcı olmaz.

arr[i] alanının değeri değil, arr dizisinin adresini yazarsınız. Yani arr[i] (hangisini istediğiniz) için hiçbir geçici özellik kazanmıyorsunuz, ancak sadece arr depolama adresi için.

Jeremy Manson önce belirtilen blog gönderisi ayrıntılı olarak açıklamaktadır: http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html

Onun iyi çözüm Atom * Diziler, jenerik türleri için yani AtomicReferenceArray (aynı zamanda temel türleri için özel formlar mevcut orada) kullanmaktır. Bu özellikle, özellikle size ihtiyacınız olan daha fazla özellik kazandığı için (atomiklik >> uçucu), özellikle verimli olduğunu düşünemiyorum.

Bir alternatif, konteynerlerin uçucu işaretçi alanları kullandığı işaretlenmiş yapılar olabilir. Ayrıca bu verimli değil ...