【问题标题】:Creating weakly referenced static variables in java在java中创建弱引用的静态变量
【发布时间】:2015-02-11 10:43:12
【问题描述】:

在我的一门课程中说SimpleDate,我需要一些像DateFormat 这样的对象,这些对象可能会在各种情况下大量使用。出于这个原因,我想让它们成为静态的。

但是,当我们没有任何 SimpleDate 对象的实例时,我还希望在需要时对这些对象进行垃圾回收。静态声明不会允许这种情况发生。

所以基本上我想要类似的东西

private weakstatic DateFormat df = DateFormat.getInstance();

如果声明类的对象不再存在,则此DateFormat 实例应该有资格进行垃圾回收。此外,每当创建声明类的任何新实例时,都应重新初始化它。这样我们可以避免重复使用的对象的重新创建,但也可以在不再需要它们时释放内存。

我知道使用 Wea​​kReferences 应该是可能的。但是,我想不出办法。

编辑: DateFormat 在这里可能是错误的候选者,因为它不是线程安全的。但它应该像声明它们一样是线程安全的。

我们的想法是,我们经常将变量设置为静态变量,以便跨实例使用。这些变量永远存在,直到应用程序终止。因此,如果您只是触摸一个类,它的静态变量将永远保留在内存中。

【问题讨论】:

  • 这是一个坏主意,原因有很多,尤其是因为SimpleDateFormat 不是线程安全的,因此如果没有某种形式的同步,就无法在线程之间安全地共享。其次,这不是弱引用的工作原理,第三,您是否有数据证明您的 DateFormat 实例导致了内存问题?
  • 添加到 biziclop 写的关于线程(非)安全的内容,如果您使用的是SImpleDateFormat,请查看ThreadLocal
  • 谢谢。也许 DateFormat 是一个错误的候选人。但它应该和声明它们一样安全。这个想法是我们经常将变量设置为静态变量,以便跨实例使用。这些变量会一直存在,直到应用程序终止。
  • @vikingsteve ThreadLocal 看起来像我正在寻找的东西。将调查并通知您。
  • 整个问题听起来像是一场毫无意义的微优化的大规模练习。保留哪些对象如此昂贵以至于您会注意到开销?

标签: java jvm


【解决方案1】:

我会看看这个问题的答案,它描述了如何使用ThreadLocal 将线程安全添加到本质上不是线程安全的类中,例如SimpleDateFormat

Date Conversion with ThreadLocal

由于您只需要一个 DateFormat 实例 - 每种格式(您可能有也可能没有几个)和每个线程 - 我怀疑您是否真的需要担心垃圾收集或使用 WeakReference

Nikolay 在使用 ThreadLocal 时提出了对内存的担忧,请在下面的 cmets 中查看他的链接,看看这是否适用于您的用例。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 2011-11-20
  • 2019-03-10
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多