假設我有一個名爲MyCache
的Java Bean,它有多個getter和setter。 我的應用程序中有一個MyCache
實例。這是一個volatile
字段myCache
在MyCacheHolder
。 當我需要刷新MyCache
時,我創建了它的一個新副本(它需要時間),然後我只將參考myCache
分配給這個新對象。同時刷新緩存
許多線程正在同時閱讀MyCacheHolder#myCache
。他們肯定會得到最新的參考,因爲它是volatile
。但我不確定他們是否得到完全初始化的對象。該對象通過setter進行初始化。閱讀主題不能看到myCache
的所有字段嗎?如果是,那我該如何解決?
如果你1)分配所有的值,然後2)將完全初始化的** MyCache分配給volatile字段,你沒有問題。如果您在發佈後以'_any_'的方式突變'MyCahce',那麼您有一個問題。考慮到'MyCache'是在多個線程之間共享的,我會投入大量的時間和精力來使'MyCahce'成爲**完全不可變的**類;那麼就不存在陳舊狀態的問題。 –
是的,我完全是1)和2),但我仍然擔心在分配給volatile變量之前通過setter設置到MyCache的某些值可能不會被其他線程看到。爲了讓其他線程可以看到某些「發生在......之前」的規則必須完成。 –