我是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方法,但是可以同时访问多个实例)。

09-10 04:55