2010-02-10 21 views
31

Gibt es eine Möglichkeit, Array-Elemente in Java zu deklarieren? I.e.Wie deklarieren Array Elemente in Java flüchtig?

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

erklärt der Arrayreferenzvolatile, aber die Arrayelemente (z.B. a[1]) sind noch nicht flüchtig. Also ich suche etwas wie

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

, aber es funktioniert nicht so. Ist es überhaupt möglich?

+0

@Kanagavelu Sugumar: AtomicReference _ist_ ein eingehülltes 'volatile', mit einigen zusätzlichen Methoden (getAndSet etc.). –

Antwort

27

Verwenden AtomicIntegerArray oder AtomicLongArray oder AtomicReferenceArray

Die AtomicIntegerArray Klasse implementiert ein Array int deren einzelne Felder können mit flüchtigen Semantik zugegriffen werden über die get() Klasse und set() Methoden. Ein Aufruf von arr.set(x, y) von einem Thread garantiert dann, dass ein anderer Thread, der arr.get(x) aufruft, den Wert y liest (bis ein anderer Wert an Position x gelesen wird).

See:

+0

Ich frage mich, warum es spezielle "AtomicArrays" für int und long gibt, aber nicht für andere primitive Typen ... Aber natürlich könnte der Rest der Primitiven durch Verwendung ihrer Wrapper in einem AtomicReferenceArray gefälscht werden. –

+0

Ich denke, AtomicIntegerArray und AtomicLongArray sind optimiert, um mit Integer bzw. Long zu arbeiten. – uthark

+4

@JoonasPulakka für andere primitive Typen können Sie sie auch in int oder long konvertieren, indem Sie z. 'Float.floatToIntBits (float)'. Dies vermeidet die Notwendigkeit des Boxens, wenn "AtomicReferenceArray" verwendet wird. –

6

Nein, Sie können nicht Array-Elemente flüchtig machen. Siehe auch http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html.

+0

Eigentlich können Sie, aber mit zusätzlichen Anstrengungen. – uthark

+0

Technisch macht dies die Elemente noch nicht flüchtig, aber die Array-Operationen sind volatil. Da "int" für diesen Fall ein Grundelement ist, hat es im Wesentlichen das gleiche Verhalten, aber dies könnte nicht einfach für nicht-primitive Arrays erweitert werden. – Marcus