2
私は現在Java Deadlock Tutorialを使っていますが、プログラムの例では常にデッドロックが発生することを理解しています。 ラムダ式はデッドロックを解決できますか?
public class Deadlock
{
private static class Friend
{
private final String name;
public Friend(String name) { this.name = name; }
public String getName() {return name;}
public synchronized void bow(Friend bower)
{
System.out.format("%s: %s has bowed to me!%n", this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower)
{
System.out.format("%s: %s has bowed back to me!%n", this.name, bower.getName());
}
}
public static void main(String[]args)
{
final Friend alphonse = new Friend("alphonse");
final Friend gaston = new Friend("gaston");
new Thread(new Runnable(){
@Override
public void run()
{
alphonse.bow(gaston);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
gaston.bow(alphonse);
}
}).start();
}
}
私は適切なラムダ式とスレッドのインスタンス化の1置き換える
:new Thread(() -> gaston.bow(alphonse)).start();
デッドロックの問題を解決しているようです。しかし、両方のスレッドのインスタンス化がlambdaに置き換えられると、プログラムは再びデッドロックになります。
これには理由がありますか?