两个类之间的对象同步

两个类之间的对象同步

问题描述:

我有两个webapps部署在相同的tomee。 webapp1依赖于静态对象(让我们称之为x)webapp2将会改变。 Webapp1将首先启动,但它将等待webapp2完成其启动。我在x上使用同步。 Webapp1具有同步的x块,其中webapp1将等待并且webapp2也具有同步的x块,其中webapp2将通知x。两个类之间的对象同步

但启动时,webapp1正在抛出java.lang.IllegalMonitorStateException。可能是什么原因。

这是我正在同步的独立班。

public class StaticObject { 

    private static StaticObject staticObject = new StaticObject(); 

    private boolean initialized = false; 

    public boolean isInitialized() { 
    return initialized; 
    } 

    public void setInitialized(boolean initialized) { 
    this.initialized = initialized; 

    } 
} 

这是我的web app1的应用程序侦听器。

public void contextInitialized(ServletContextEvent arg0) { 
    System.out.println("Starting webApp-1"); 
    StaticObject obj = StaticObject.getStaticObject(); 
    Initilize(obj); 
} 
private void Initilize(StaticObject obj) { 
    if (obj.isInitialized()) { 
    System.out.println("Object is initalized"); 
    } else { 
    synchronized (obj) { 
     try { 
      System.out.println("waiting for obj to be initalized"); 
      wait(); 
     } catch (InterruptedException e) { 
      throw new RuntimeException(e); 
     } 
    } 
    System.out.println("obj is initalized after waiting"); 
    } 
} 

这是我webapp2的

public void contextInitialized(ServletContextEvent arg0) { 
    System.out.println("Starting webApp-2"); 
    StaticObject obj = StaticObject.getStaticObject(); 
    initilizeit(obj); 
} 
private void initilizeit(StaticObject obj) { 
    obj.setInitialized(true); 
    synchronized (obj) { 
    System.out.println("BEFORE NOTIFY"); 
    obj.notifyAll(); 
    System.out.println("AFTER NOTIFY"); 
    } 
} 

所以应用听众,部署在同一tomee都webapp1和webapp2的,同时开始我webapp1启动过程中获得java.lang.IllegalMonitorStateException之后。

堆栈跟踪:

java.lang.IllegalMonitorStateException 
at java.lang.Object.wait(Native Method) 
at java.lang.Object.wait(Object.java:502) 
at ca.app1.AppListener.Initilize(AppListener.java:38) 
at ca.app1.AppListener.contextInitialized(AppListener.java:27) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4716) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5178) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1405) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1395) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

感谢您的帮助。

取而代之的是:

synchronized (obj) { 
    try { 
     System.out.println("waiting for obj to be initalized"); 
     wait(); 
    } 

你说这个?

synchronized (obj) { 
    try { 
     System.out.println("waiting for obj to be initalized"); 
     obj.wait(); 
    } 
+0

我试图obj.wait(),然后webapp1不停地等待,而webapp2完全不 –

+0

嗯开始。在这种情况下,我怀疑你的两个webapps不是在StaticObject的同一个实例上运行的。 This: http://stackoverflow.com/questions/17721263/singleton-across-jvm-or-application-instance-or-tomcat-instance/17721573#17721573 可能是相关的。 –