[英]In an Apache Tomcat application, do MBean fields need to be volatile/synchronized for JMX updates to appear in other threads?
我一直在我們的Spring Web應用程序中公開bean,以防我們需要動態地進行配置更改。 最近我一直在審查並發性,我開始想知道當你通過JMX改變其中一個bean時,其他線程會發生什么?
JMX是否有某種方法可以強制刷新內存模型,因此您不必擔心使字段易失/同步以確保其他線程看到更改?
當Tomcat創建一個新線程來處理請求時,即使該字段不是線程安全的,該線程也會看到更改,對嗎? 因此,除非我需要更改以立即在當前請求線程中生效,否則有任何理由擔心並發問題?
JMX處理程序不是特殊線程。 需要在其他線程中看到的任何更改都需要標記為volatile
或synchronized
。
// this needs to be volatile because another thread is accessing it
private volatile boolean shutdown;
...
@JmxOperation(description = "Shutdown the server")
public void shutdownSystem() {
// this is set by the JMX connection thread
shutdown = true;
}
也就是說,通常JMX值是統計數據或配置設置,我不介意在下一個內存屏障被越過時懶惰地更新。 這適用於計數器和其他調試信息以及布爾值和僅由JMX設置的其他值,盡管它們由其他線程使用。 在這些情況下,我沒有將字段標記為volatile
,並且還沒有咬過我們。 因人而異。
僅供參考, @JmxOperation
注釋來自我的SimpleJmx庫 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.