原子引用

public class AtomicReferenceDemo {
public static void main(String[] args) {
User cuzz = new User("cuzz", 18);
User faker = new User("faker", 20);
AtomicReference<User> atomicReference = new AtomicReference<>();
atomicReference.set(cuzz);
System.out.println(atomicReference.compareAndSet(cuzz, faker)); // true
System.out.println(atomicReference.get()); // User(userName=faker, age=20)
}
}

ABA问题的产生

/**
* 当有一个值从 A 改为 B 又改为 A,这就是 ABA 问题
**/
public class ABADemo {
private static AtomicReference<Integer> atomicReference = new AtomicReference<>(100); public static void main(String[] args) {
new Thread(() -> {
atomicReference.compareAndSet(100, 101);
atomicReference.compareAndSet(101, 100);
}).start(); new Thread(() -> {
// 保证上面线程先执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
atomicReference.compareAndSet(100, 2019);
System.out.println(atomicReference.get()); // 2019
}).start();
}
}

时间戳原子引用

/**
* 我们先保证两个线程的初始版本为一致,后面修改是由于版本不一样就会修改失败
**/
public class ABADemo2 {
private static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(100, 1); public static void main(String[] args) {
new Thread(() -> {
int stamp = atomicStampedReference.getStamp();
System.out.println(Thread.currentThread().getName() + " 的版本号为:" + stamp);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
atomicStampedReference.compareAndSet(100, 101, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1 );
atomicStampedReference.compareAndSet(101, 100, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1 );
}).start(); new Thread(() -> {
int stamp = atomicStampedReference.getStamp();
System.out.println(Thread.currentThread().getName() + " 的版本号为:" + stamp);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean b = atomicStampedReference.compareAndSet(100, 2019, stamp, stamp + 1);
System.out.println(b); // false
System.out.println(atomicStampedReference.getReference()); // 100
}).start();
}
}

最新文章

  1. python学习笔记 ——python写的猜数字游戏 002
  2. TFS2008 安装图解(详细版本)(转载)
  3. C#中获取程序集版本号的方法
  4. Reactor构架模式--转载
  5. 实现多个ContentProvider对多张表进行操作
  6. codeforces.com/contest/325/problem/B
  7. AlphaBlend參数BLENDFUNCTION
  8. 解读QML之三
  9. android 学习之RecyclerView
  10. 将js进行到底:node学习笔记2
  11. 十个 PHP 开发者最容易犯的错误
  12. hdu 5274 树链剖分
  13. java版数据结构与算法 (1综述)
  14. 【转载】ASP.NET自定义404和500错误页面
  15. Linux大棚命令记录
  16. 微软BI 之SSIS 系列 - 在 SSIS 中使用 Web Service 以及 XML 解析
  17. qt 提高图片加载速度
  18. npm 及安装
  19. 不用webservice wcf提供服务,用Rest更轻量
  20. VS2015+Opencv半永久配置

热门文章

  1. ftp 搭建 centos 源
  2. ThinkCMF&amp;Thinkphp 首页静态化处理
  3. AI and Neuroscience: A virtuous circle
  4. 更换git远程仓库地址
  5. springboot文件上传(可单文件/可多文件)
  6. 谷歌分析(GA)新版的有哪些改变
  7. 如何分析和监测竞争对手网站的seo数据
  8. 【已学完】UGUI Schedule
  9. 故障:fork failed:Resource Temporarily Unavailable解决方案
  10. SpringBoot整合Quartz及log4j实例