1

我有一个带有动作监听器的类(作为 JSF 托管 bean 的一部分)。动作侦听器中的代码正在创建另一个类的新对象。A类。这个对象被用来调用这个类的一个函数..

public void invokeActionListener(ActionEvent act)
{
MyClass myclass=new MyClass();
myclass.invokeRequest();
}

在处理一些数据后,invokeRequest 函数依次调用另一个函数 B。函数 B 调用另一个函数 C。C 调用 D,然后流程结束。

我想确保只调用一次 invokeRequest 直到完成流程直到 D 完成。

我在函数 invokeRequest() 上设置了同步,但同步不起作用。即使 1 个线程仍在工作,不同的线程也可以调用此函数。

Class MyClass
{
public synchronized void invokeRequest()
{
 invokeRequestB();
}

public void invokeRequestB()
{
invoke RequestC();
}

public void invokeRequestC()
{
invoke RequestD();
}

public void RequestD()
{
//Complete processing and end the flow.
}

请指导......

4

1 回答 1

3

同步方法使用它们各自的对象进行锁定。如果需要防止不同对象中的同步调用,仍然需要使用同一个对象进行同步。一种方法是使用静态字段进行同步:

Class MyClass {
    private static final Object lock = new Object();

    public void invokeRequest() {
        synchronized (lock) {
            invokeRequestB();
        }
    }
    ...
}

或者您可以MyClass.class用作监控对象;使用您认为更具可读性的任何内容。

于 2013-09-16T13:45:39.503 回答