我是J2EE的新手,因此很抱歉。我必须解决一个不良的数据库设计,该设计具有无法并行安全地完成的更新。解决此问题的最简单方法(目前)是在方法调用周围放置互斥保护,以序列化对其的访问。
我知道您不能安全地仅在J2EE中的方法上使用synced关键字,因为容器可能会干扰。 J2EE中是否有一种“受支持的”方式在EJB中进行互斥/信号灯/锁定,以确保整个J2EE应用程序对方法的访问都已序列化?
最佳答案
尝试使用静态对象作为互斥量,例如:
private static final Object mutex = new Object ();
public void someMethod() {
synchronized(mutex) {
// do work that must be globally synchronous
}
}
在方法本身上使用
synchronized
对您不起作用的原因是,Java EE容器可能会创建多个EJB实例,但是标记为synchronized
的方法仅在每个实例的基础上受到保护(每个实例可以一次只能有一个线程执行synchronized
方法,但是可以同时访问多个实例)。