ThreadLocal为什么要设计成private static

https://www.zhihu.com/question/35250439








结论:

1 static 防止无意义多实例

2 当static时,ThreadLocal ref生命延长-ThreadMap的key在线程生命期内始终有值-ThreadMap的value在线程生命期内不释放——故线程池下,static修饰TrheadLocal引用,必须(1)remove   或(2)手动  ThreadLocal ref = null


两个例子:

A      《多线程实战》上ThreadLocal的一个实例







作者测试的顺序:

1 创建10000个runnable对象放入max 10的线程池,创建10个Thread,即10个~Map;

2 新建ThreadLocal(1)对象,调用get/set,产生10个SimpleDateFormat对象;

3 static ThreadLocal red = null ,此时ThreadLocal对象仅有一个弱引用,在Thread.~Map中;

4 第一次gc,回收了ThreadLocal对象,同时致使 Thread.~Map中存在10个key为null的value;

5 再创建10000个runnable对象,放入线程池原先的10个线程;

6 新建ThreadLocal(2)对象,调用set,触发新变量加入Thread.~Map,进而触发中key为null的value对象被置为可回收对象,原先的value对象与Thread的强引用断开

7 第二次gc,正式回收被与Thread断开强引用的10个SimpleDateFormat对象




B      模仿spring事务框架时的一个数据库连接例子


Java事务处理全解析(四)—— 成功的案例(自己实现一个线程安全的TransactionManager)


http://blog.csdn.net/huilangeliuxin/article/details/43446733

这篇文章中有个实例:

定义一个线程安全的SingleThreadConnectionHolder类如下:

[java]  view plain  copy
  1. public class SingleThreadConnectionHolder  
  2. {  
  3.     private static ThreadLocal<ConnectionHolder> localConnectionHolder = new ThreadLocal<ConnectionHolder>();  
  4.              
  5.     public static Connection getConnection(DataSource dataSource) throws SQLException  
  6.     {  
  7.         return getConnectionHolder().getConnection(dataSource);  
  8.     }  
  9.              
  10.     public static void removeConnection(DataSource dataSource)  
  11.     {  
  12.         getConnectionHolder().removeConnection(dataSource);  
  13.     }  
  14.              
  15.     private static ConnectionHolder getConnectionHolder()  
  16.     {  
  17.         ConnectionHolder connectionHolder = localConnectionHolder.get();  
  18.         if (connectionHolder == null)  
  19.         {  
  20.             connectionHolder = new ConnectionHolder();  
  21.             localConnectionHolder.set(connectionHolder);  
  22.         }  
  23.         return connectionHolder;  
  24.     }  
  25.              
  26. }  

可以看到,每次事务提交后,都调用remove,防止连接泄露



  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值