我有一个带有动作监听器的类(作为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.
}
请指导.....
答案 0 :(得分:3)
synchronized方法使用各自的对象进行锁定。如果需要阻止同步不同对象中的调用,则仍需要使用同一对象进行同步。一种方法是使用静态字段进行同步:
Class MyClass {
private static final Object lock = new Object();
public void invokeRequest() {
synchronized (lock) {
invokeRequestB();
}
}
...
}
或者您可以使用MyClass.class
作为监视对象;使用你觉得更具可读性的东西。