首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于 ThreadLocal 的疑问,该如何处理

2012-01-22 
关于 ThreadLocal 的疑问我想知道当线程结束后,相应的ThreadLocal对象是否会被释放?我写了一个测试:import

关于 ThreadLocal 的疑问
我想知道当线程结束后,相应的   ThreadLocal   对象是否会被释放?我写了一个测试:

import   java.util.Date;

/**
  *   测试大量   ThreadLocal   是否被释放
  *
  *   @author   yidinghe
  */
public   class   TestLargeAmountThreadLocals   extends   Thread   {

        private   static   ThreadLocal   cache   =   new   ThreadLocal();

        public   void   run()   {
                cache.set(new   Date());
        }

        public   static   void   main(String[]   args)   throws   Exception   {
                long   mem0   =   Runtime.getRuntime().totalMemory()   -   Runtime.getRuntime().freeMemory();
                for   (int   i   =   0;   i   <   1000;   i++)   {
                        new   TestLargeAmountThreadLocals().start();
                }
                Thread.sleep(5000);
                long   mem1   =   Runtime.getRuntime().totalMemory()   -   Runtime.getRuntime().freeMemory();
                System.out.println( "usage:   "   +   (mem1   -   mem0));
        }
}

测试结果却是:
usage:   -17736

我不知道这是怎么回事。

[解决办法]
当线程结束后,ThreadLocal 会被释放。

不过,你测试的结果返回一个负数,我也不知道怎么回事。

----------------
ThreadLocal 的值实际上保存在Thread.threadLocals变量里。当线程结束时,会调用
Thread.exit()方法,在这个方法里,执行了threadLocals = null;这条语句。
[解决办法]
结果是个负数,的确比较奇怪,一开始我以为是没有调用GC的缘故,
结果:没有调用GC的话,返回结果是正数,
调用GC以后,返回结果负数,和预期的结果恰好相反。

热点排行