class Main {
public static volatile Callee callee;
static class Callee {
public void call
() { System.
out.
println("Method called"); }
public Callee() {
Main.callee = this;
System.
out.
println("I am constructed!"); }
}
static class Creator
implements Runnable { public void run() { Main.callee = new Callee(); }
}
static class Caller
implements Runnable { public void run() {
while (Main.callee == null);
Main.callee.call();
}
}
public static void main
(String...
args) { new Thread(new Creator
()).
start(); new Thread(new Caller
()).
start(); }
}
Y2xhc3MgTWFpbiB7CgogIHB1YmxpYyBzdGF0aWMgdm9sYXRpbGUgQ2FsbGVlIGNhbGxlZTsKCiAgc3RhdGljIGNsYXNzIENhbGxlZSB7CiAgICBwdWJsaWMgdm9pZCBjYWxsKCkgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZCBjYWxsZWQiKTsgfQoKICAgIHB1YmxpYyBDYWxsZWUoKSB7CiAgICAgIE1haW4uY2FsbGVlID0gdGhpczsKICAgICAgdHJ5IHtUaHJlYWQuc2xlZXAoMTAwMCk7fSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSSBhbSBjb25zdHJ1Y3RlZCEiKTsKICAgIH0KICB9CgogIHN0YXRpYyBjbGFzcyBDcmVhdG9yIGltcGxlbWVudHMgUnVubmFibGUgewogICAgcHVibGljIHZvaWQgcnVuKCkgeyBNYWluLmNhbGxlZSA9IG5ldyBDYWxsZWUoKTsgfQogIH0KCiAgc3RhdGljIGNsYXNzIENhbGxlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgd2hpbGUgKE1haW4uY2FsbGVlID09IG51bGwpOwogICAgICBNYWluLmNhbGxlZS5jYWxsKCk7CiAgICB9CiAgfQoKICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcuLi4gYXJncykgewogICAgbmV3IFRocmVhZChuZXcgQ3JlYXRvcigpKS5zdGFydCgpOwogICAgbmV3IFRocmVhZChuZXcgQ2FsbGVyKCkpLnN0YXJ0KCk7CiAgfQp9