2015-02-11 26 views
1

在我的一個類中說SimpleDate,我需要一些對象,如DateFormat,這些對象可能會在各種實例中使用很多時間。出於這個原因,我想讓它們變成靜態的。在java中創建弱引用的靜態變量

但是,我還希望這些對象應該在需要時進行垃圾回收,當我們沒有任何剩餘的對象SimpleDate時。靜態聲明不會允許發生這種情況。

所以基本上我想如果不再存在任何聲明類的對象像

private weakstatic DateFormat df = DateFormat.getInstance(); 

DateFormat實例應該有資格進行垃圾回收。此外,每當創建任何聲明類的新實例時,都應該重新初始化它。通過這種方式,我們可以避免重複使用對象的重新創建,也可以在不再需要時釋放內存。

我知道應該可以使用WeakReferences。但是,我無法想出辦法。

編輯︰ DateFormat可能是一個錯誤的候選人,因爲它不是線程安全的。但它應該像聲明它們是靜態一樣是線程安全的。

這個想法是,我們經常使變量靜態的跨實例使用。這些變量一直存在直到申請程序結束。所以如果你只是觸碰一個類,它的靜態變量會永遠留在內存中。

+2

由於以下幾個原因,這是一個糟糕的主意,尤其是因爲'SimpleDateFormat'不是線程安全的,所以如果沒有某種形式的同步就無法在線程之間安全地共享。其次,這不是多麼弱的引用工作,第三,你有數據證明你的'DateFormat'實例導致內存問題? – biziclop 2015-02-11 10:46:22

+2

添加到biziclop寫的關於線程(非)安全性的內容中,如果使用'SImpleDateFormat',請查看'ThreadLocal'。 – vikingsteve 2015-02-11 10:49:06

+0

謝謝。也許DateFormat在這裏是一個錯誤的候選人。但是它應該和聲明靜態一樣安全。我們的想法是,我們經常使用變量static來跨越實例。這些變量一直存在直到申請程序結束。 – adwiv 2015-02-11 10:50:46

回答

0

我想看看這個問題的答案,該問題描述瞭如何使用ThreadLocal將線程安全添加到本質上不是線程安全的類,如SimpleDateFormat

Date Conversion with ThreadLocal

因爲你只需要DateFormat一個實例 - 每個線程每格式(您可能會或可能不會有幾個)和 - 我懷疑你真正需要擔心垃圾收集或使用WeakReference

尼古拉已經使用ThreadLocal時,提出了關於內存關注,請參閱在下面的評論他的鏈接,看看這是否適用於您的使用情況或沒有。

+0

不是表現,而是記憶。看看這個https://stackoverflow.com/questions/17968803/threadlocal-memory-leak幾句話:如果你控制你的線程,使用ThreadLocal,如果沒有 - 避免它等。 – Nikolay 2015-02-11 11:35:34

+0

非常感謝尼古拉。 – vikingsteve 2015-02-11 12:16:51