如何解决易失性变量没有按预期工作
我认为如果我有 2 个可变变量 i
,i1
那么如果我设置例如:
i = 2;
i = 3;
i1 = 5;
所以另一个线程永远不会找到i1 == 5
而是i == 2
,但是尝试下面的代码,发现有时它不能按预期工作:
public class Main {
private static volatile int i = 0;
private static volatile int i1 = 0;
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(Main::writerThread);
Thread t1 = new Thread(Main::readerThread);
t.start();
t1.start();
t.join();
t1.join();
}
public static void writerThread() {
for (int j = 0; j < 100000; j++) {
i = j;
i1 = j;
}
}
public static void readerThread() {
int myI,myI1;
for (int j = 0; j < 100000; j++) {
myI = i;
myI1 = i1;
if (myI1 > myI) {
System.out.println(myI + " < " + myI1);
}
}
}
}
myI
永远不应该是 < myI1
,但有时确实如此。例如我得到:711 < 712
。
解决方法
写入单个 System.Diagnostics.Process.Start(@"C:\Users\foly\Downloads\parsecpor\parsecd.exe");
变量是原子的。但是对两个或多个 volatile
变量的写入序列不是原子的。
这是一个执行跟踪,将导致输出“711
volatile
QED
(上面的writer: j -> 711
writer: i -> 711
writer: i1 -> 711
reader: read i (711) ; 711 -> myI
writer: j -> 712
writer: i -> 712
writer: i1 -> 712
reader: read i1 (712) ; 712 -> myI1
reader: myI1 (712) > myI (711) == true
是写入者的变量。读取者的j
的值与输出无关。)
简而言之,您的程序编写并不能保证j
永远不会小于myI
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。