在我的一个班级中说SimpleDate
,我需要一些像DateFormat
这样的对象,这些对象可能会在不同的实例中花费很多时间。出于这个原因,我想让它们变得静止。
但是,如果我们没有剩下SimpleDate
个对象的任何实例,我还希望在需要时对这些对象进行垃圾回收。静态声明不允许这种情况发生。
所以基本上我想要像
这样的东西private weakstatic DateFormat df = DateFormat.getInstance();
如果不再存在声明类的对象,则此DateFormat
实例应符合垃圾回收的条件。此外,只要创建了任何新的声明类实例,就应该重新初始化它。这样我们就可以避免重复使用重复使用的对象,但是当不再需要它们时也可以释放内存。
我知道应该可以使用WeakReferences。但是,我无法找到办法。
编辑: DateFormat可能是错误的候选者,因为它不是线程安全的。但它应该像线程安全一样声明它们是静态的。
我们的想法是,我们经常将变量设置为跨实例使用的变量。这些变量永远存在,直到应用程序进程终止。因此,如果您只是触摸一个类,它的静态变量将永远保留在内存中。
答案 0 :(得分:0)
我将看一下这个问题的答案,该问题描述了如何使用ThreadLocal
将线程安全性添加到本身不具有线程安全性的类中,例如SimpleDateFormat
。
Date Conversion with ThreadLocal
由于你只需要一个DateFormat
个实例 - 每个格式(你可能有几个)和每个线程 - 我怀疑你真的需要担心垃圾收集或使用WeakReference
Nikolay在使用ThreadLocal
时引起了对内存的担忧,请在下面的评论中查看他的链接,看看这是否适用于您的用例。