簡體   English   中英

在Apache Tomcat應用程序中,MBean字段是否需要易失/同步才能使JMX更新出現在其他線程中?

[英]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處理程序不是特殊線程。 需要在其他線程中看到的任何更改需要標記為volatilesynchronized

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM