10. volatile による修正案
public class StopThread {
private static volatile boolean stopRequested;
public static void main(String[] args) throws InterruptedException {
Thread backgroundThread = new Thread(new Runnable() {
public void run() {
int i = 0;
while (!stopRequested)
i++;
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true; // 反映される
}
11. volatile の失敗例
// 不完全- 同期が必要!
private static volatile int nextSerialNumber = 0;
public static int generateSerialNumber() {
return nextSerialNumber++; // この操作はアトミックではない!
// ので、タイミング次第では、複数のスレッドで
// 同じシリアルナンバーを得てしまう(安全性エ
ラー)
}
12. AtomicLong
public static synchronized long generateSerialNumber() {
if (nextSerialNumber == Long.MAX_VALUE)
throw new なんとかException();
return nextSerialNumber++;
↑同等!(かつ、後者の方が速い可能性が高い)↓
}
private static final AtomicLong nextSerialNum = new AtomicLong();
public static long generateSerialNumber() {
return nextSerialNum.getAndIncrement();
}