volatile
的使用和重要性,如果省略volatile
,这个例子将不会得到良好的结果。但是我并不太习惯使用
volatile
。以下代码的思路是,如果省略volatile
,则会导致无限循环,并且如果存在volatile
,则可以完全保证线程安全。以下代码是否线程安全?您有没有其他现实而简短的使用volatile
的代码示例,如果没有volatile
,它将显然给出错误的结果?以下是代码:
public class VolatileTest implements Runnable {
private int count;
private volatile boolean stopped;
@Override
public void run() {
while (!stopped) {
count++;
}
System.out.println("Count 1 = " + count);
}
public void stopCounting() {
stopped = true;
}
public int getCount() {
if (!stopped) {
throw new IllegalStateException("not stopped yet.");
}
return count;
}
public static void main(String[] args) throws InterruptedException {
VolatileTest vt = new VolatileTest();
Thread t = new Thread(vt);
t.start();
Thread.sleep(1000L);
vt.stopCounting();
System.out.println("Count 2 = " + vt.getCount());
}
}
count++
操作不是原子操作。你必须在这个操作周围加锁,或者使用非阻塞的AtomicInteger
。 - Bruno Reisrun()
,否则上面的代码不能被称为线程安全) - Bruno Reis