AtomicReferenceArray有什么用?

时间:2010-09-29 16:53:35

标签: java concurrency

何时使用AtomicReferenceArray是个好主意?请举例说明。

5 个答案:

答案 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