public class VolatileTest {
private volatile static int a = 0;
private static int cnt = 0;
public static void test() {
if (a == 0) {
a = 1;
cnt++;
}
}
public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[2];
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 2; j++) {
threads[j] = new Thread(VolatileTest::test);
}
for (Thread thread : threads) {
thread.start();
}
for (Thread thread : threads) {
thread.join();
}
if (cnt == 2) {
System.out.println("false!");
}
a = 0;
cnt = 0;
}
System.out.println("finish");
}
}
在反复启动程序的尝试中,一般出现的情况是控制台出现一次 false!,偶尔会出现两次或者不出现。
希望能达成 false!永远不会被输出,即 cnt 结束时总为 1 的结果,能否在不引入 Atomic*类,synchrnozied,加锁等更高级工具,只使用 volatile 实现?
cnt ++ 代表着希望被执行一次的代码。可能会有多个线程调用 VolatileTest.test(),但 cnt++只执行一次。
谢谢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.