我有一个用例,我必须防止两个不同类中的两种不同方法同时运行,即如果 A 类有方法 X,B 类有方法 Y,我必须确保在执行方法 X 时,我在方法 X 完成之前,不应允许方法 Y 执行或阻止执行。
class A{
@Scheduled
methodX(){
}
}
class B{
methodY(){}
}
一点背景知识,这methodX
是一个计划进程,负责从远程数据库读取数据、转换、做一些映射并将其存储在本地数据库中。
methodY
是一种通用实现(可以由 REST 调用或另一个计划进程触发),它从不同来源读取数据,其中一个来源是由 存储的数据methodX
,读取后它还会进行一些映射并将数据发送到另一个系统.
由于我必须在两个不同的类中同步两种不同的方法,因此同步关键字或块不是正确的解决方案。
我在这里在方法 X 和方法 Y 中使用了共享计数信号量,即
class A{
@Scheduled
methodX(){
if(sharedSemaphore.tryAcquire()){
// read data, do mappings etc.
...
...
sharedSemaphore.release();
}
}
}
class B{
methodY(){
if(sharedSemaphore.tryAcquire()){
...
...
...
sharedSemaphore.release();
}
}
}
上面的代码示例只是实际实现的一小部分,有没有更好的方法呢?信号量是在这里使用的正确并发原语吗?如何确保两个不同类中的两个不同方法不会同时执行?