Java volatile变量无法正常运行。
谁能解释为什么它在这里不起作用?由于我被声明为volatile,因此应该保护它免受内存不一致的影响。
它受到保护,但不幸的i++是不是原子操作。它实际上是读取/递增/存储。因此,volatile这不会使您摆脱线程之间的竞争状况。您可能会从程序中获得以下操作顺序:
线程#1读取i,得到10之后,线程#2读取i,得到10#1线程i增加到11线程#2递增i到11线程#1将11存储到 i线程2将11存储到 i如您所见,即使发生了2个增量,并且线程之间的值已正确同步,竞争条件也意味着该值仅增加了1。请看此美观的说明。这是另一个很好的答案:Java线程中的volatileint是安全的吗?
您应该使用的是AtomicInteger允许您从多个线程安全地递增的内容。
static final AtomicInteger i = new AtomicInteger(0);...for (int j = 0; j<1000000; j++) { i.incrementAndGet();}解决方法
public class MyThread {volatile static int i;
public static class myT extends Thread {public void run (){ int j = 0; while(j<1000000){i++;j++; }} } public static void main (String[] argv) throws InterruptedException{ i = 0; Thread my1 = new myT(); Thread my2 = new myT(); my1.start(); my2.start(); my1.join(); my2.join(); System.out.println('i = '+i); }}
由于易失性构建发生在关系之前,因此i的最终值应严格为2000000。但是,实际结果与变量i不具有易失性没有什么不同。谁能解释为什么它在这里不起作用?由于我被声明为volatile,因此应该保护它免受内存不一致的影响。
相关文章:
1. 为什么一个类里面只能有一个私有的 我不知道按了什么谁给解释一下2. javascript - 小demo:请教怎么做出类似于水滴不断扩张的效果?3. python3的各种库的官方文档中文版在哪儿可以找到4. 求大神帮我看看是哪里写错了 感谢细心解答5. macos - mac用VMware Fusion安装了centos7,我怎么把centos映射到本地,就像windows映射一个网络位置6. html5 - css3scale和rotate同时使用转换成matrix写法该如何转换?7. thinkjs - 使用mysql搭建cms应该如何设计表?或怎样开始?8. mysql 获取时间函数unix_timestamp 问题?9. python - nginx为什么不能反代图片?10. php自学从哪里开始?
