私はJ.Brochの効果的なJavaを読んでいますが、今は私はエイリアンメソッドについてのセクションにあります。Java並行処理におけるエイリアンメソッドの理解
私は、Javaの並行性とそれらが行う可能性のある害から、エイリアンメソッドを理解しようとしています。彼が言ったように、私たちは基本的に、エイリアンメソッドが何をすることができるのか分からず、デッドロックを起こすことがあります。私は、このようなデッドロック動作は、以下のシンプルなアプリを書いて再現してみました(外国人の方法は、単純化のために同じクラスである):
public class App {
private static StringBuffer lines = new StringBuffer();
public static void modifyLines(){
System.out.println("Invocation modifyLines() started by " + Thread.currentThread().getName());
synchronized (lines) {
System.out.println("Entering modifyLines() synchronized " + Thread.currentThread().getName());
lines.append("Modified");
}
}
public static void main(String[] args) throws InterruptedException {
synchronized (lines) {
System.out.println("Entering main() synchronized by " + Thread.currentThread().getName());
alienMethod();
}
}
public static void alienMethod(){
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new Runnable() {
@Override
public void run() {
modifyLines();
}
});
es.shutdown();
}
}
私は場所を取るために、デッドロックを期待していることalienMethod()
に呼び出すことによって生成されたスレッドだろうmodifyLines()
内の同期ブロックには決して入力しないでください。しかし、プログラムは以下を出力します。
Entering main() synchronized by main
Invocation modifyLines() started by pool-1-thread-1
Entering modifyLines() synchronized pool-1-thread-1
これは、デッドロックが発生しなかったことを意味します。どうして?エイリアンメソッドの例で何が問題になっていますか?
効果的なJavaの第2版では、並行性に関する話題のアイテム。 Brian Goetzによる「Java Concurrency in Practice」で詳しく説明されています。 – scottb