class Downloader extends Thread {
private InputStream in;
private OutputStream out;
private ArrayList<ProgressListener> listeners;
public Downloader(URL url, String outputFilename) throws IOException {
in = url.openConnection().getInputStream();
out = new FileOutputStream(outputFilename);
listeners = new ArrayList<ProgressListener>();
}
public synchronized void addListener(ProgressListener listener) {
listeners.add(listener);
}
public synchronized void removeListener(ProgressListener listener) {
listeners.remove(listener);
}
private synchronized void updateProgress(int n) {
for (ProgressListener listener: listeners)
listener.onProgress(n);
}
public void run() {
int n = 0, total = 0;
byte[] buffer = new byte[1024];
try {
while((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
total += n;
updateProgress(total);
}
out.flush();
} catch (IOException e) { }
}
}
上記のコードは、本「7 週間で 7 つの同時実行モデル」からのものです。この本によると、同期されたメソッド updateProgress が別のロックを取得する可能性のあるエイリアン メソッド [onProgress] を呼び出すため、上記のコードにはデッドロックが発生する可能性があります。正しい順序なしに 2 つのロックを取得するため、デッドロックが発生する可能性があります。
上記のシナリオでデッドロックがどのように発生するかを説明できる人はいますか?
前もって感謝します。