@PostConstruct
函数返回的System.identityHashCode(this)
版本不同于“相同”单例的@Autowired
版本。
我没有多个应用程序上下文,只涉及一个上下文。我不希望线程或静态内部类的存在是相关的,但是为了以防万一,我将它们包括在内。
@Service
public class A extends Thread {
@PostContruct
public void init() {
start();
}
@Service
public static class B extends A {
public B() {
}
public void run() throws Throwable {
System.err.println("B("+System.identityHashCode(this)+") waiting...");
synchronized(this) {wait(6000000);}
System.err.println("B("+System.identityHashCode(this)+") done waiting the full 6000 seconds and never less");
}
}
private B b;
@Autowired(required=true)
public A(B b) {
this.b = b;
}
public void run() throws Throwable {
Thread.sleep(10000);//just for example
//the following lines could be triggered from any thread
System.err.println("autowire B("+System.identityHashCode(b)+").notifyAll()");
synchronized(b) {b.notifyAll();}
}
}
我希望B
的原始哈希码与从类Autowired
中找到的A
哈希码匹配。但是它们是不同的对象,因此notifyAll
永远不会中断B
的等待。
B(329759586) waiting...
//10 seconds latter
autowire B(932795037).notifyAll()
//5990 seconds latter
B(329759586) done waiting the full 6000 seconds and never less