如何在J2EE EJB中创建互斥锁

时间:2015-10-02 01:30:30

标签: java multithreading java-ee synchronization

我是J2EE的新手,所以如果这很明显就道歉。我必须解决一个糟糕的数据库设计,它有一个无法并行安全的更新。解决此问题的最简单方法(暂时)是在方法调用周围放置互斥锁,以序列化它的访问权。

我知道你不能安全地在J2EE中的方法上使用synchronized关键字,因为容器可能会干扰。 J2EE中是否有“支持”的方式在EJB中创建互斥/信号量/锁,以确保为整个J2EE应用程序序列化对方法的访问?

2 个答案:

答案 0 :(得分:1)

尝试使用静态对象作为互斥锁,例如:

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

答案 1 :(得分:0)

为了繁荣,java.util.concurrent都被批准在容器中使用。使用信号量阻止将在单个容器中工作,但您需要更高级别的同步才能在群集中保持同步。