2010-11-15 47 views
6

讓我給你這個場景。保持對單線程中的線程的引用是安全的嗎?

說我加載的第一個Activity也創建了一個線程,它將在後臺無限期地運行。

現在,如果我移動到另一個Activity,我認爲我最初在主活動中創建的線程將繼續運行。

所以,現在我的主要問題 - 爲了從其他活動管理這個後臺線程,是否可以安全地將對該線程的引用存儲在單例對象中?

+0

我在我的一個應用程序中做了類似的事情。沒有任何問題。儘管如此,我稍後切換到了預定的TimerTask。看起來更安全和易於使用。 – 2010-11-15 12:25:03

回答

4

是的,沒有。理論上,你將沒有問題,但是你不能允許引用轉義。

將單引號保留爲私人對象時可能出現問題,它不得將引用傳遞給其他任何對象或允許其他對象訪問對象,否則可能會失去控制權。其次,您的活動創建的線程不得訪問其成員變量或允許引用它們以進行轉義。

一本好書,在這方面是「Java併發實踐」的作者Brian Goetz

+0

+1用於規定單身人士必須始終擁有控制權(而不是始發活動) – 2010-11-15 14:24:08

+0

具有完美意義 - 感謝您清除此問題。有問題的線程將自成一體,不會共享任何內容。 – xil3 2010-11-15 14:33:09

2

其實,你需要小心是,如果你有多個類加載器。如果您使用相同的類加載器來加載類,Singleton只是一個單例。如果您的應用程序中有多個類加載器運行相同的類,則每個類中都會有另一個單例實例。

大多數獨立應用程序只使用一個類加載器,因此沒有任何問題。如果你只有一個類加載器,那麼你會沒事的。

+0

+1另一種可能的訪問發佈/共享方式。 – Jaydee 2010-11-15 16:00:44