import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import static java.util.concurrent.ThreadLocalRandom.current; public class AtomicReferenceExample { private static AtomicReference<DebitCard> debitCardAtomicReference = new AtomicReference<>(new DebitCard("Alex",0)); public static void main(String[] args){ // 启动 10 个线程 for (int i = 0; i < 10; i++) { new Thread("T-"+i){ @Override public void run(){ while(true){ // 获取 AtomicReference 的当前值 DebitCard debitCard = debitCardAtomicReference.get(); // 基于 AtomicReference 的当前值创建一个新的 DebitCard DebitCard newDc = new DebitCard(debitCard.getAccount(),debitCard.getAmount()+10); // 基于CAS 算法更新 AtomicReference 的当前值 // 每一次对 AtomicReference 的更新操作,我们都采用 “CAS 乐观非阻塞”的方式进行。 if(debitCardAtomicReference.compareAndSet(debitCard,newDc)){ System.out.println(newDc); } try { TimeUnit.MILLISECONDS.sleep(current().nextInt(20)); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } } }
--------------------------------------------------------------
public class DebitCard { private final String account; private final int amount; public DebitCard(String account, int amount) { this.account = account; this.amount = amount; } public String getAccount() { return account; } public int getAmount() { return amount; } @Override public String toString() { return "DebitCard{" + "account='" + account + '\'' + ", amount=" + amount + '}'; } }
-----------------------------------------------------
补充: AtomicReference 所提供的 “ 非阻塞原子性对象引用 ” 读写解决方案,被应用在很多高并发容器中,比如 ConcurrentHashMap 。