Java原子操作与多线程操作测试一例
2016-12-30 18:04
197 查看
从别处发现这个有意思的测试, 加不加volatile来修饰变量是有不同的, 具体原因请详究Java的内存模型/线程运行机制/volatile关键字.
Java中的赋值, 除了long和double之外均为原子操作, 也就是说, 在多线程环境中, 在很小很小的几率下会拿到一个既非原值, 又不是其他所赋值的"半个变量". 但是这种情况只是理论上, 在现实中非常罕见, 因为Java强烈建议虚拟机(有很多Java虚拟机, 有些并非官方实现)实现时将long和double都实现成原子操作, 并且很多虚拟机都遵从了Java的建议.
直接贴代码:
Java中的赋值, 除了long和double之外均为原子操作, 也就是说, 在多线程环境中, 在很小很小的几率下会拿到一个既非原值, 又不是其他所赋值的"半个变量". 但是这种情况只是理论上, 在现实中非常罕见, 因为Java强烈建议虚拟机(有很多Java虚拟机, 有些并非官方实现)实现时将long和double都实现成原子操作, 并且很多虚拟机都遵从了Java的建议.
直接贴代码:
/** * 从别处发现这个有意思的测试, 加不加volatile来修饰变量是有不同的, 具体原因请详究Java的内存模型/线程运行机制/volatile关键字 * * 由于check()方法中的if判断不是原子操作, 所以是会打印Error的 * * @author David Ding * */ public class ThreadSharedField { // private long shared = 0; private volatile long shared = 0; public void set0() { shared = 0; } public void set1() { shared = 1; } public void check() { if (0 != shared && 1 != shared) { System.err.println("Error"); } } public static void main(final String[] args) { final ThreadSharedField v = new ThreadSharedField(); // 线程 1:设置 b = 0 final Thread set0Th = new Thread() { public void run() { while (true) { v.set0(); } }; }; set0Th.start(); // 线程 2:设置 b = 1 final Thread set1Th = new Thread() { public void run() { while (true) { v.set1(); } }; }; set1Th.start(); // 线程 3:检查 0 != b && 1 != b final Thread testTh = new Thread() { public void run() { while (true) { v.check(); } }; }; testTh.start(); } }
相关文章推荐
- JAVA多线程中,原子操作的概念——原子操作真的不需要进行同步控制吗?
- java多线程之synchornized原理以及原子操作探究学习
- Java多线程——非原子64位操作(long,double)
- java多线程环境下对变量的读写操作的原子性问题
- Java多线程--原子操作的原理
- Java多线程并发锁和原子操作,你真的了解吗?
- Java多线程并发锁和原子操作,你真的了解吗?
- Java多线程复习与巩固(八)--原子性操作与原子变量
- java多线程[11]:原子操作(atomic)
- JVM线程测试与java原子操作
- Java多线程中实现原子操作的方法
- Java中对AtomicInteger和int值在多线程下递增操作的测试
- Java多线程编程--(6)学习Java5.0 并发编程包--原子操作的一些类型
- Java 多线程下race condition/同步/原子操作问题
- Java中关于原子操作和volatile关键字
- 多线程环境下对变量的读写操作的原子性问题(一道百度笔试题引发的思考)
- Java Thread 多线程 操作线程
- Java Thread 多线程 操作线程
- 深入浅出 Java Concurrency (2): 原子操作 part 1
- 破除java神话之三:原子操作都是线程安全的