我有一个带有动作侦听器的类(作为JSF托管bean的一部分)。动作侦听器中的代码正在创建另一个类的新对象。 A级
该对象用于调用此类的功能。

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


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

我想确保,在D结束之前,仅应调用一次invokeRequest直到完整流程为止。

我对函数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.
}


请指导.....

最佳答案

同步方法将其各自的对象用于锁定。如果需要防止在不同对象中进行同步调用,则仍需要使用同一对象进行同步。一种方法是使用静态字段进行同步:

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

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


或者,您可以使用MyClass.class作为监视对象;使用您发现更具可读性的内容。

08-04 20:50