原子性地将实例中的数组替换为一个新数组,该数组也包含新值,如果实例包含终端值,则返回false。
/** * Copyright 2015 David Karnok and Netflix, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See * the License for the specific language governing permissions and limitations under the License. */ /** 来 自 NowJava.com - 时代Java **/ //package com.nowjava; import java.util.concurrent.atomic.*; import java.util.function.*; public class Main { /** * Atomically replaces the array in instance with a new array that contains the newValue as well * or returns false if the instance holds the terminalValue. * @param updater * @param instance * @param newValue * @param terminalValue * @param arraySupplier * @return */ public static <T, U> boolean add( AtomicReferenceFieldUpdater<T, U[]> updater, T instance, U newValue, U[] terminalValue, IntFunction<U[]> arraySupplier) { for (;;) { U[] a = updater.get(instance); if (a == terminalValue) { return false; } int n = a.length; U[] b = arraySupplier.apply(n + 1); /* 来 自* N o w J a v a . c o m */ System.arraycopy(a, 0, b, 0, n); b[n] = newValue; if (updater.compareAndSet(instance, a, b)) { return true; } } } /** * Atomically replaces the array in instance with a new array that contains the newValue as well * or returns false if the instance holds the terminalValue. * @param instance * @param newValue * @param terminalValue * @param arraySupplier * @return */ public static <U> boolean add(AtomicReference<U[]> instance, U newValue, U[] terminalValue, IntFunction<U[]> arraySupplier) { for (;;) {