- 浏览: 341625 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
白色蜻蜓:
...
(转载)新浪微博错误提示代码 -
crzdot:
我也是用ultroiso做的mini启用盘,然后再把iso拷到 ...
centos6.4安装 -
k496229870:
...
libgdx学习之Camera -
DiaoCow:
蛮不错的。
redis命令思维导图 -
kingdelee:
HTTPClient完胜?
URLConnection与HttpClient的对比
今天线程池实现,看到一个使用ThreadLocal的地方,研究了一下ThreadLocal这东西,发现很有意思。
从源码研究看ThreadLocal的实现原理吧
package com.sogou.game.cms.pool; import org.apache.thrift.transport.TSocket; public class ConnectionManager { ThreadLocal<TSocket> socketThreadSafe = new ThreadLocal<TSocket>(); /** 连接提供池 */ public ConnectionProvider connectionProvider; public ConnectionManager(){ connectionProvider=new ConnectionProviderImpl(); } /** * 取socket * @return TSocket */ public TSocket getSocket() { TSocket socket = null; try { socket = connectionProvider.getConnection(); socketThreadSafe.set(socket); return socketThreadSafe.get(); } catch (Exception e) { e.printStackTrace(); } finally { connectionProvider.returnCon(socket); socketThreadSafe.remove(); } return socket; } public ConnectionProvider getConnectionProvider() { return connectionProvider; } public void setConnectionProvider(ConnectionProvider connectionProvider) { this.connectionProvider = connectionProvider; } }
这段代码里面使用了ThreadLocal,ThreadLocal在使用时一般会声明为static变量,后面分析源码时候会说到为什么是static。
ThreadLocal
看一下ThreadLocal的get方法
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); }
获取当前线程,然后将当前线程传入getMap()得到ThreadLocalMap
下面是ThreadLocalMap的实现方式,可以简单认为是一个map,key为ThreadLocal值,value为要set的值;
static class ThreadLocalMap { /** * The entries in this hash map extend WeakReference, using * its main ref field as the key (which is always a * ThreadLocal object). Note that null keys (i.e. entry.get() * == null) mean that the key is no longer referenced, so the * entry can be expunged from table. Such entries are referred to * as "stale entries" in the code that follows. */ static class Entry extends WeakReference<ThreadLocal> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal k, Object v) { super(k); value = v; } } }
继续getMap方法
ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
返回Thread t的threadLocals的值,那threadLocals为何物呢?
ThreadLocal.ThreadLocalMap threadLocals = null;
转了一圈怎么又回来了
理一下思路
static ThreadLocal 在set的时候是set到Thread自有的ThreadLocalMap中,key为threadlocal变量
ThreadLocal的作用就了然了
在多线程,假设ThreadA、ThreadB,static的ThreadLocal是相同的,当ThreadA执行set方法是,是将相应的key、value set自己独有的ThreadLocalMap中,get方法的原理也同样。由于key不变,所以保证多线程在get、set时取到自身在set、get时值,这也是为什么ThreadLocal一般是static了。
发表评论
-
volatile变量
2013-09-04 10:44 8361.volatile变量 当变量声明为volatile类 ... -
slf4j源码分析
2012-12-11 15:58 5806近期由于想利用应用程序的输出日志做一些应用,了解了下java ... -
HashSet、LinkedHashSet 实现原理
2012-12-07 16:00 1536之前没用过HashSet,听到别人提到HashSet,看了下源 ... -
HashMap、LinkedHashMap实现原理
2012-12-07 15:47 1048看源码可以知道HashMap内 ... -
logback udp appender
2012-11-29 11:44 2403package com.macken; impor ... -
log4j
2012-11-23 11:47 928log4j简要结构图 logback -
Java关键字synchronized
2012-08-15 17:57 01、synchronized关键字的作 ... -
HtmlCleaner CleanerProperties 参数配置
2012-07-06 15:34 3020Parameter Default ... -
dom4j读取http xml文件
2012-07-04 14:19 1484使用dom4j读取http xml文件,结合XPATH提取数据 ... -
(转)Filter(过滤器)简介和工作原理
2012-07-04 10:07 1325Filter(过滤器)简介 F ... -
HttpClient实现HTTP文件通用下载类
2012-07-03 15:16 52515import java.io.File; import ... -
Java 解析BT Torrent文件
2012-07-03 14:49 0参考资料: http://www.cesclub.co ... -
URLConnection与HttpClient的对比
2012-07-01 22:00 2649from:http://www.innovation.ch/j ... -
httpclient进化
2012-07-01 21:35 1343httpcomponents与commons-httpclie ... -
(转)HttpClient4.1入门教程
2012-07-01 21:05 0HttpClient简介 1) 百科名片: H ... -
Java操作excel
2012-06-28 13:57 881使用JexcelApi包 maven依赖 <de ... -
Java并发编程之ConcurrentHashMap
2012-06-18 15:10 870http://www.goldendoc.org/2011/0 ... -
正则提起图片地址
2012-06-16 14:07 1010<p><img alt=" ... -
Web-harvest 2.0 Maven 配置
2012-05-08 14:26 1373<project xmlns="htt ... -
htmlparse module导入eclipse
2012-04-28 15:08 929源码地址 https://htmlparser.svn.s ...
相关推荐
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
ThreadLocal那点事儿编程开发技术共6页.pdf.zip
ThreadLocal
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
正确理解ThreadLocal.pdf
DbUTils中用ThreadLocal类
主要介绍ThreadLocal的原理,实例分析以及注意事项
java 简单的ThreadLocal示例
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
本例以序列号生成的程序为例,展示ThreadLocal的使用
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
Synchronized与ThreadLocal
设计模式及ThreadLocal详细讲解资料,想要学习java或者提升自己技术的同学可以下载观看
详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露
JDBC事务的封装和Threadlocal实例,参考博客:http://blog.csdn.net/daijin888888/article/details/50988053
ThreadLocal源码分析,主要有ThreadLocal源码以及ThreadLocal的内部结构在jdk8前后的变化
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。