【发布时间】:2018-12-10 00:07:55
【问题描述】:
我有一个用例,我必须防止两个不同类中的两个不同方法同时运行,即如果 A 类有方法 X 而 B 类有方法 Y,我必须确保当方法 X 被执行,我不应该让方法 Y 执行或阻止执行,直到方法 X 完成。
class A{
@Scheduled
methodX(){
}
}
class B{
methodY(){}
}
一点背景,
这里methodX是一个调度进程,负责从远程数据库读取数据,转换,做一些映射并存储在本地数据库中。
methodY 是一个通用实现(可以由 REST 调用或另一个预定进程触发),它从不同来源读取数据,其中一个来源是 methodX 存储的数据,读取后它也可以一些映射并将数据发送到另一个系统。
由于我必须在两个不同的类中同步两个不同的方法,因此 synchronized 关键字或块不是正确的解决方案。
我在这里在方法 X 和方法 Y 中使用了共享计数信号量,即
class A{
@Scheduled
methodX(){
if(sharedSemaphore.tryAcquire()){
// read data, do mappings etc.
...
...
sharedSemaphore.release();
}
}
}
class B{
methodY(){
if(sharedSemaphore.tryAcquire()){
...
...
...
sharedSemaphore.release();
}
}
}
上面的代码示例只是实际实现的一小部分,有没有更好的方法呢?信号量是在这里使用的正确并发原语吗?如何确保两个不同类中的两个不同方法不会同时执行?
【问题讨论】:
-
你知道同步关键字吗?
-
一个
ReentrantLock而不是一个信号量就足够了。synchronized块也可以做到这一点。您只需要一个在两种方法中都可用的对象,可以在其上同步执行。
标签: java concurrency locking semaphore java.util.concurrent