需要确保只有1个线程访问资源

时间:2013-09-16 13:39:10

标签: java multithreading

我有一个带有动作监听器的类(作为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.
}

请指导.....

1 个答案:

答案 0 :(得分:3)

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

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

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

或者您可以使用MyClass.class作为监视对象;使用你觉得更具可读性的东西。