ブックJava concurrency in practiceには、カスタマイズされたスレッドの例があります (セクション 8.3.4 のリスト 8.7 を参照してください)。以下にコードを貼り付けました。よく分からないことが一つあります。つまり、run()
メソッドは volatile 変数debugLifecycle
を使用する前にコピーします。また、全体で一貫した値を確保するために、コメントのCopy デバッグ フラグがあります。ここに変数をコピーする必要はありますか? はいの場合、なぜですか?
public class MyAppThread extends Thread {
public static final String DEFAULT_NAME = "MyAppThread";
private static volatile boolean debugLifecycle = false;
public MyAppThread(Runnable r) {
this(r, DEFAULT_NAME);
}
public MyAppThread(Runnable runnable, String name) {
super(runnable, name + "-" + created.incrementAndGet());
setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t,
Throwable e) {
log.log(Level.SEVERE,
"UNCAUGHT in thread " + t.getName(), e);
}
});
}
public void run() {
// Question: why copy the volatile variable here?
// Copy debug flag to ensure consistent value throughout.
boolean debug = debugLifecycle;
if (debug) log.log(Level.FINE, "Created " + getName());
try {
alive.incrementAndGet();
super.run();
} finally {
alive.decrementAndGet();
if (debug) log.log(Level.FINE, "Exiting " + getName());
}
}
}