两个类之间的对象同步
问题描述:
我有两个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();
}
我试图obj.wait(),然后webapp1不停地等待,而webapp2完全不 –
嗯开始。在这种情况下,我怀疑你的两个webapps不是在StaticObject的同一个实例上运行的。 This: http://stackoverflow.com/questions/17721263/singleton-across-jvm-or-application-instance-or-tomcat-instance/17721573#17721573 可能是相关的。 –