在单上下文Spring应用程序中避免多实例单例

时间:2019-04-02 01:10:06

标签: spring singleton

@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

0 个答案:

没有答案