Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用实例理解易变变量_Java_Multithreading_Volatile - Fatal编程技术网

Java 用实例理解易变变量

Java 用实例理解易变变量,java,multithreading,volatile,Java,Multithreading,Volatile,我一直在读一节关于易变变量的文章。该规范提供了一个示例,我尝试使用它进行实验。我已经编写了代码: static volatile int i = 0, j = 0; public static void main(String args[]) { Thread t1 = new Thread(new Runnable() { @Override public void run() { for (int k = 0; i <

我一直在读一节关于易变变量的文章。该规范提供了一个示例,我尝试使用它进行实验。我已经编写了代码:

static volatile int i = 0, j = 0;

public static void main(String args[]) {
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int k = 0; i < 200000; k++) {
                i++;
                j++;
            }
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int k = 0; i < 200000; k++) {
                System.out.println("i=" + i + " j=" + j);
            }
        }
    });
    t1.start();
    t2.start();
}

怎么了?

i的实际值总是大于或等于
j

您在日志中看到的是而不是
i
j
的实际(当前)值。它是评估时
i
j
的值

链接的文档状态

然而,方法2的任何给定调用都可能 观察j的值,该值远远大于观察的值 i、 因为方法一可能会在两个时刻之间执行多次 当方法2获取i的值时,以及当方法2 获取j的值


线程
t1
运行,增加
i
j
一系列时间。上下文切换。线程
t2
运行、计算
i
并连接它。上下文切换。线程
t1
继续递增
i
j
。上下文切换。线程
t2
计算
j
并连接它。因此
j
仍然小于或等于
i
,您只是在不同的时间对它们进行了评估。

引用您链接到的页面:但是,方法二的任何给定调用都可能观察到j的值远大于i的值,因为方法一可能在方法二获取i值和方法二获取j值之间执行多次。所以,不,spec没有“这么说”。
i=147609 j=147684
i=149412 j=149521
i=150447 j=150523
i=151384 j=151457
i=152307 j=152380
i=153222 j=153297
i=154139 j=154214
i=155065 j=155138
i=155967 j=156040
i=156880 j=156952
i=157790 j=157863
i=158760 j=158833
i=159671 j=159747
i=160592 j=160664
i=161510 j=161584
i=162420 j=162497
i=163350 j=163425
i=164292 j=164365
i=165230 j=165306
i=166179 j=166252
i=167113 j=167187
i=168055 j=168128
i=169002 j=169078
i=169948 j=170021
i=170898 j=170974
i=171851 j=171924
i=172794 j=172866
i=173724 j=173796
i=174658 j=174733
i=175641 j=175714
i=176572 j=176645
i=177503 j=177575
i=178442 j=178517
i=179394 j=179467
i=180328 j=180403
i=181276 j=181351
i=182232 j=182305
i=183178 j=183251
i=184130 j=184205
i=185092 j=185167
i=186043 j=186118
i=186998 j=187071
i=195792 j=195866
i=196718 j=196784
i=197629 j=197698
i=198543 j=198608
i=199489 j=199555