2010-02-10 17 views
31

Java volatile dizi elemanlarını bildirmek için bir yolu var mı? YaniJava'da dizi elemanları nasıl geçici olarak bildirilir?

volatile int[] a = new int[10]; 

dizi referansıvolatile bildirir ancak dizi elemanları (örneğin a[1]) birlikte, uçucu değildir. Bu yüzden

volatile int[] a = new volatile int[10]; 

gibi bir şey arıyorum ama öyle çalışmıyor. Bütün bunlar mümkün mü?

+0

@Kanagavelu Sugumar: AtomicReference bazı ilave yöntemler (getAndSet vs), bir sarılmış 'volatile' _is_. Acaba –

cevap

27

kullanımı AtomicIntegerArray veya AtomicLongArray veya AtomicReferenceArray

AtomicIntegerArray sınıf sınıfının get() ve set() yöntemlerle, tek tek alanlar uçucu semantik ile erişilebilen bir int dizi, uygular. bir akıştan arr.set(x, y) arama daha sonra (başka bir değer, x konumuna, okunan kadar) arr.get(x) çağrı başka bir iş parçacığı değeri y okuyacağı garanti edecektir.

Bkz:

+0

neden 'spesifik AtomicArrays' int ve uzun süre, ancak diğer ilkel türleri için vardır ... Ama tabii ilkel kalan bir' AtomicReferenceArray' onların sarmalayıcılarını kullanarak sahte olabilir. –

+0

AtomicIntegerArray ve AtomicLongArray'ın sırasıyla tamsayı ve uzun süre çalışacak şekilde optimize edildiğini düşünüyorum. – uthark

+4

@JoonasPulakka diğer ilkel türler için de int veya long kullanarak örn. 'Float.floatToIntBits (float)'. Bu, 'AtomicReferenceArray' kullanıldığında boks ihtiyacını ortadan kaldırır. –

6

Hayır, dizi elemanları uçucu yapamaz. Ayrıca bkz. http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html.

+0

Aslında yapabilirsiniz, ancak ek çabalarla. – uthark

+0

Teknik olarak bu hala öğeleri uçucu hale getirmiyor, ancak dizi işlemleri uçucudur. Bu durumda 'int' bir ilkel olduğundan, aslında aynı davranışa sahiptir, ancak bu ilkel olmayan diziler için kolayca genişletilemez. – Marcus