何时使用AtomicReferenceArray
是个好主意?请举例说明。
答案 0 :(得分:9)
看起来它在功能上等同于AtomicReference[]
,虽然占用的内存少了一点。
所以当你需要超过一百万个原子引用时它是有用的 - 无法想到任何用例。
答案 1 :(得分:9)
如果你有一个共享的对象引用数组,那么你将使用AtomicReferenceArray
来确保不同的线程不能同时更新数组,即一次只能更新一个元素。
但是,在AtomicReference[]
(AtomicReference
数组)中,多个线程仍然可以模拟地更新不同的元素,因为原子性在元素上,而不是在整个数组上。
更多信息here。
答案 2 :(得分:1)
如果您有大量同时更新的对象,例如在大型多人游戏中,它可能会很有用。
参考i
的更新将遵循模式
boolean success = false;
while (!success)
{
E previous = atomicReferenceArray.get(i);
E next = ... // compute updated object
success = atomicReferenceArray.compareAndSet(i, previous, next);
}
根据具体情况,这可能比锁定(synchronized
)更快和/或更容易使用。
答案 3 :(得分:1)
一个可能的用例是ConcurrentHashMap,它在内部广泛使用数组。数组可以是易失性的,但在每个元素级别,语义不能是易失性的。这是自动阵列出现的原因之一。
答案 4 :(得分:0)
import java.util.concurrent.atomic.AtomicReferenceArray;
public class AtomicReferenceArrayExample {
AtomicReferenceArray<String> arr = new AtomicReferenceArray<String>(10);
public static void main(String... args) {
new Thread(new AtomicReferenceArrayExample().new AddThread()).start();
new Thread(new AtomicReferenceArrayExample().new AddThread()).start();
}
class AddThread implements Runnable {
@Override
public void run() {
// Sets value at the index 1
arr.set(0, "A");
// At index 0, if current reference is "A" then it changes as "B".
arr.compareAndSet(0, "A", "B");
// At index 0, if current value is "B", then it is sets as "C".
arr.weakCompareAndSet(0, "B", "C");
System.out.println(arr.get(0));
}
}
}
// Result:
// C
// C