Java方法线程安全

时间:2016-10-23 15:01:30

标签: java multithreading

我有一个场景,搜索了很多,但没有得到满意的答案。

有一个服务类,WebserviceInvokerService,

class WebserviceInvokerService {
    @Override
    public void synchronized callBackFun() {...}
}

callBackFun ==>是在事件(某个事件)发生时被调用的函数。

在callBackFun中,我检查数据库并相应地进行服务调用(此业务中不涉及该类的实例成员)。

我已使callBackFun同步。有可能会创建多个WebserviceInvokerService实例,并在这些对象上调用callBackFun。

我想调用callBackFun"同步"穿过物体。那么"同步"对于callBackFun,在这种情况下会有任何意义。

3 个答案:

答案 0 :(得分:2)

要跨实例进行同步,您应该使用synchronized with static reference。

class WebserviceInvokerService {
    @Override
    public void callBackFun() {
        synchronized(WebserviceInvokerService.class) {... } 
    }
}

答案 1 :(得分:2)

如果java多个实例WebserviceInvokerServices,这些方法将在每个实例中同步,但不会跨实例。

你可能正在寻找的是一个锁。

你可以试试这个:

private final static Lock lock = new ReentrantLock();

@Override
public void callBackFun() {
    lock.lock();
    try {
        // Do things here
    } finally {
        lock.unlock();
    }
}

编辑: 添加了@Wyzard

提到的final关键字

答案 2 :(得分:-1)

由于callBackFun不使用实例成员(根据帖子:该业务不涉及该类的实例成员)

您可以将此代码放在static synchronized方法中,以便存在类级别锁定。从您的实例方法

中调用它
public synchronized void callBackFun() {
    actualFunLogic();
}

private static synchronized void actualFunLogic()
{
   .....
}