簡體   English   中英

Java:將值傳遞給內部類的線程安全性

[英]Java: Thread safety of passing value to inner class

因此,在這種情況下,我需要為公司的部分應用程序編寫密集的操作,將其置於UI線程之外(我們使用Swing),並與一大堆高度線程不安全的組件進行交互。 娛樂時間。

我正在嘗試為自己簡化此過程。 所以這是怎么回事:

1)來自線程不安全組件的數據將僅被讀取,而不被寫入。

2)對該數據的引用將被傳遞到后台線程,如下所示:

final Object someData = getSomeData();
        Runnable task = new Runnable() {
            @Override
            public void run() {
                doSomething(someData);
            }
        };

同樣,模式對話框將阻止用戶在此過程中無意中更改任何值。 因此someData的狀態在整個過程中將保持不變,只能從中讀取。

因此,我對內存一致性問題總是很偏執。 這里有東西嗎? 通過以這種方式傳遞引用,后台線程是否可以在那個時候獲得其最新狀態?

謝謝。

如果要使用Runnable啟動新線程,或者將其提交給執行程序,則新線程將看到直到創建線程為止發生的所有操作。 因此,只要后台線程運行時狀態沒有變化,您的數據就將可見。 對於不可變的對象,這將更容易保證。

執行者

內存一致性影響:在將Runnable對象提交給Executor之前,線程中的操作發生在其執行開始之前,也許是在另一個線程中。

Thread.start

當一條語句調用Thread.start時,與該語句具有事前發生關系的每個語句也與新線程執行的每個語句都具有事前發生關系。 導致創建新線程的代碼效果對於新線程是可見的。

為了將數據發送回UI線程,如果更改通過invokeLater ,則可以確保可見性。 請參見在invokeLater()或invokeAndWait情況下是否給出了before-before關系?

如果您使用Swing Worker,則其中一些管理為您管理。 這使您可以覆蓋在后台線程中運行的方法,然后在事件分配線程中完成操作后覆蓋另一個方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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