我看过问题How do determine if an object is locked (synchronized) so not to block in Java?
但是我有一个我无法解决的问题。
在我的Web应用程序中是刷新数据容器的过程,该过程可能需要很长时间。必须在一定时间间隔内进行刷新。当然,当一次刷新仍在容器中进行时,另一刷新不能(不要破坏容器中的数据)。
我想使用后台线程刷新容器。多个后台工作人员可以同时在多个容器上工作(不同用户 session 的不同工作人员,每个用户 session 在其容器中可以有不同的数据)。
当然,我可以在worker中执行synchronize(myContainer),以强制任何其他worker当前未更新此特定容器。但是我宁愿检查是否有任何 worker 正在容器上并退出,如果有的话。我也不想更改容器的代码,所以我不想在容器类中添加ReentrantLock并对其进行锁定。
因此,工作程序具有MyContainer实例,并想要确定当前是否有任何其他工作程序正在刷新此容器实例。

有什么想法要实现吗?

最佳答案

使用AtomicBoolean,将此代码放在MyContainer类中:

AtomicBoolean isRefreshing = new AtomicBoolean(false);

void refresh() {
  if ( isRefreshing.compareAndSet( false, true)) {
    try {
      // refresh
    } finally {
      isRefreshing.set( false);
    }
  }
}

如果您不能触摸MyContainer,则可以创建一个RefreshWrapper,其中包含AtomicBoolean和MyContainer实例。

关于java - 如何在不锁定的情况下同步对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17276108/

10-12 18:22