package maventest.concurrency; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class App { private static final int NUMBER_OF_THREAD = 2; private class Appl implements Runnable { public AnnotationConfigApplicationContext applicationContext; public Appl(AnnotationConfigApplicationContext applicationContext) { this.applicationContext = applicationContext; } public void run() { this.applicationContext.refresh(); } } public void run() throws InterruptedException { AnnotationConfigApplicationContext[] contexts = new AnnotationConfigApplicationContext[App.NUMBER_OF_THREAD]; Thread[] threads = new Thread[App.NUMBER_OF_THREAD]; for (int i = 0; i < App.NUMBER_OF_THREAD; i++) { contexts[i] = new AnnotationConfigApplicationContext(); contexts[i].register(BeansDefinition.class); threads[i] = new Thread(new Appl(contexts[i])); } for (int i = 0; i < App.NUMBER_OF_THREAD; i++) { threads[i].start(); } for (int i = 0; i < App.NUMBER_OF_THREAD; i++) { threads[i].join(); } for (int i = 0; i < App.NUMBER_OF_THREAD; i++) { TheBean bean1 = contexts[i].getBean(TheBean.class); for (int j = i + 1; j < App.NUMBER_OF_THREAD; j++) { TheBean bean2 = contexts[j].getBean(TheBean.class); if (bean1 == bean2) { throw new RuntimeException("Error, bean from context " + i + " is shared with bean from context " + j + ". (" + bean1 + "," + bean2 + ")"); } } } for (int i = 0; i < App.NUMBER_OF_THREAD; i++) { contexts[i].close(); } } public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 100; i++) { App app = new App(); app.run(); } } }