【发布时间】:2010-09-03 13:28:27
【问题描述】:
在变量上使用 volatile 可降低内存一致性错误的风险(如果这揭示了我对任何相关概念的理解存在一些漏洞,请纠正我)。所以在下面的例子中,即使变量 c1 是易失性的,内存恒常性错误的发生仍然会导致 c1 在输出中变为 15 或有时为 14,而不是正确的输出 16。
class Lunch implements Runnable {
private volatile long c1 = 0;
private Object lock1 = new Object();
private Object lock2 = new Object();
public void inc1() {
// synchronized(lock1) { c1 is volatile
c1++;
// }
}
public void run() {
try {
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
}
catch(InterruptedException e) {
return;
}
}
public long value() {
return c1;
}
public static void main(String args[]) throws InterruptedException {
Lunch l = new Lunch();
Thread t1 = new Thread(l);
Thread t2 = new Thread(l);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(l.value());
}
}
【问题讨论】:
-
这里的假设是 ++ 是原子的。验证你的假设!
-
(我有点担心你使用“降低风险”这个词。通常的目的是确保完全没有风险。)
标签: java multithreading concurrency volatile