持有对Thread对象的引用会导致内存泄漏吗?

时间:2015-03-30 09:21:38

标签: java garbage-collection

我想编写一个代理来确保特定对象只在特定线程上使用,所以我需要保持对Thread对象的引用(因为JavaDoc说id可以被重用)。这个引用会导致线程(而不是Thread对象)在终止时没有被完全垃圾收集吗?

1 个答案:

答案 0 :(得分:0)

  

我想编写一个代理来确保特定对象只在特定线程上使用,所以我需要保存对Thread对象的引用

你没有。您可以使用仅在特定线程中设置的ThreadLocal<Boolean>

  

这个引用会导致线程(而不是Thread对象)在终止时没有被完全垃圾回收吗?

您的引用会导致Thread泄漏,但正如@superbob写的那样,未指定操作系统线程会发生什么。只要你知道它只是一个单一的线程,我就不在乎。

虽然ThreadLocal可能leak,但没有子类化的简单ThreadLocal<Boolean>(特别是不使用initialValue())也没有泄漏。


  

我使用的外部库有一个对象池,但是代码库对象中的某个地方过早地返回到池中,从而导致在多个线程上使用非线程安全对象。我想写一个代理来检测这种情况。当对象从池中取出时,代理应存储对currentThread的引用,如果调用线程与存储的Thread不同,则抛出该引用。

这听起来与你的问题完全不同,似乎使我的上述答案无效。我很久以前写过这样的话:

import com.google.common.collect.MapMaker;

public static synchronized boolean singleThreaded(Object o) {
    final Thread neu = Thread.currentThread();
    final Thread old = threadMap.put(o, neu);
    return old==null || old==neu;
}

private final static Map<Object, Thread> threadMap =
    new MapMaker().weakKeys().weakValues().makeMap();

并在调试时使用它,以确保通过

在单个线程中使用someObject
assert singleThreaded(someObject)

由于所有参考文献都很薄弱,我希望没有泄漏