我看过问题How do determine if an object is locked (synchronized) so not to block in Java?
但我有问题,我找不出解决方案。
在我的Web应用程序中,刷新数据容器的过程可能需要很长时间。刷新被迫按时间间隔进行。当然,当一个刷新仍然在容器上工作时,另一个不能(不会破坏容器中的数据)。
我想用后台线程刷新容器。多个后台工作人员可以同时在多个容器上工作(不同用户会话的不同工作人员,每个用户会话的容器中可以有不同的数据)。
当然,我可以在工作人员处做synchronize(myContainer)
以强制任何其他工作人员当前未更新此特定容器。但我宁愿要检查是否有任何工人在集装箱上工作并退出,如果是。另外我想不更改容器的代码,所以我不想在容器类中添加ReentrantLock并锁定它。
因此,工作人员有MyContainer
实例,并且想要确定是否有其他worker正在刷新此容器实例。如何在不锁定的情况下同步对象?
任何想法如何实现?
'ConcurrentLinkedQueue'是非阻塞的,这意味着如果OP不小心,while循环可以做一些严重的忙碌转动 –
@John Vint我假设队列已经拥有所有的容器,工作线程将启动,如果容器立即重新添加到队列中或者立即添加到与原始队列交替的另一个队列中,情况就会如此。如果不是这种情况,那么'BlockingQueue'会是更好的选择 - 如果容器被同时添加到队列中并从队列中移除,我的回答中的循环不会忙碌,但它会冒着过早终止的风险。 –
@JohnVint:实际上,我的答案也有同样的缺点,但我认为限制刷新的频率超出了这个问题的范围,OP应该有适当的方法来解决这个问题。否则,一个'ScheduledExecutorService'将是很好的解决方案。 –