我看過問題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'將是很好的解決方案。 –