本文翻译自http://tutorials.jenkov.com/java-util-concurrent/atomicreferencearray.html,人工翻译,仅供学习交流。
atomic包中的AtomicReferenceArray是一个可以原子更新的对象引用数组。AtomicReferenceArray类也支持比较并交换功能。
您可以使用AtomicReferenceArray的两个构造函数之一来创建它。第一个构造函数接受一个int作为形参,这个int指定要创建的AtomicReferenceArray的长度,意思是它应该有多少元素的空间。下面是一个使用此构造函数创建AtomicReferenceArray的Java示例:
AtomicReferenceArray array = new AtomicReferenceArray(10);
这个例子创建了一个AtomicReferenceArray,容量为10(它有容纳10个引用对象的空间)。
第二个构造函数接受一个E[]数组作为参数,其中E是对象引用的类型(类)。使用此构造函数创建的AtomicReferenceArray将具有与数组参数相同的容量,并且数组参数中的所有元素将被复制到AtomicReferenceArray中。下面是一个使用此构造函数创建AtomicReferenceArray的Java示例:
Object[] source = new Object[10]; source[5] = "Some string"; AtomicReferenceArray array = new AtomicReferenceArray(source);
这个例子首先创建了一个Object[]数组,并在索引为5的元素中设置一个值。然后它用Object[]数组作为参数创建一个AtomicReferenceArray。您还可以为AtomicReferenceArray设置泛型类型。下面是上面的例子,泛型类型被设置为String:
String[] source = new String[10]; source[5] = "Some string"; AtomicReferenceArray<String> array = new AtomicReferenceArray<String>(source);
get()方法返回具有给定索引的元素的值。索引作为参数传递给get()方法。下面示例:
Object element = array.get(5);
如果AtomicReferenceArray具有泛型类型,get()方法将返回该类型的对象。例如,如果泛型是String,那么你可以像这样调用get():
String element = array.get(5);
注意,不需要对String进行强制转换。
set()方法设置具有特定索引的元素的值。索引和值作为参数传递给set()方法。下面示例:
array.set(5, "another object");
第一个参数是要设置的元素的索引。第二个参数是要为元素设置的值。如果AtomicReferenceArray有一个泛型类型,此参数的类型将是该类型。否则类型为Object。
AtomicReferenceArray的compareAndSet()方法将存储在给定元素中的当前引用与预期引用进行比较,如果引用对象相同,用新引用交换当前引用。下面是一个compareAndSwap()的例子:
String string1 = "string1"; String string2 = "string2"; String[] source = new String[10]; source[5] = string1; AtomicReferenceArray<String> array = new AtomicReferenceArray<String>(source); array.compareAndSet(5, string1, string2);
这个例子首先创建了一个String数组,并将索引为5的元素设置为指向string1的引用。它将索引为5的元素的值与string1的引用进行比较,如果它们相同,则将元素的引用设置为string2。如果没有其他线程改变索引为5的元素的引用(在上述情况下,哪一个是不可能的),然后设置成功(设置新的引用)。
AtomicIntegerArray还有几个用于特殊目的的方法。您应该查看AtomicIntegerArray类的JavaDoc,以了解有关这些方法的更多信息。