volatile(四) 不具有原子性
程序员文章站
2022-03-03 16:14:18
...
这个 volatile 不具有原子性,这个我们改怎么测试才能说明问题呢?
目前先设计下面的方案吧,以后再有好的方案,我在更新文章
实验设计
10个线程,每个线程都对 volatile修饰的count进行++操作10000次
实验假设
-
假设一: 如果 volatile 修饰的 count++ 具有原子性
预期结果:为10*10000 = 100000; -
假设二: 如果 volatile 修饰的 count++ 操作不具有原子性
预期结果:小于100000 的不确定的值。
public class TestVolatile {
volatile int count = 0;
void m() {
for (int i = 0; i < 10000; i++) count++;
}
public static void main(String[] args) {
TestVolatile t = new TestVolatile();
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < 10; i++) {
threads.add(new Thread(t::m, "thread-" + i));
}
threads.forEach((o) -> o.start());
threads.forEach((o) -> {
try {
o.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println(t.count);
}
}
运行结果:
第一次测试结果:90489
第二次测试结果:94560
测试结论
假设一不成立
结果符合假设二
总结
volatile 不能保证原子性
推荐阅读
-
事务四大特征:原子性,一致性,隔离性和持久性(ACID)
-
对volatile不具有原子性的理解
-
volatile为什么不保证原子性?为什么Atomic保证原子性?
-
Volatile关键字只具备可见性 不具备原子性
-
volatile有什么用?为什么volatile变量的复合操作不具有安全性?volatile是怎么实现可见性和禁止重排序的(有序性)?具体的禁止重排优化实例?
-
测试volatile不具有原子性,加volatile还用加sysnchronized吗?加sysnchronized还用加volatile吗?
-
事务四大特征:原子性,一致性,隔离性和持久性(ACID)
-
CAS(比较并交换)学习CAS实现原子性+volatile实现可见性,cas与synchronized比较的优缺点
-
线程安全、volatile关键字、原子 性
-
为什么volatile不能保证原子性?