`

ThreadLocal 的原理和实例

 
阅读更多
ThreadLocal 是java开源中非常流行的线程管理工具类,它能防止并发并且能提高效率,应该如果用synchronized,效率实在太差了。
看了它的源码,我们就很容易知道它的原理了:
public class ThreadLocal
{
 private Map values = Collections.synchronizedMap(new HashMap());
 public Object get()
 {
  Thread curThread = Thread.currentThread(); 
  Object o = values.get(curThread); 
  if (o == null && !values.containsKey(curThread))
  {
   o = initialValue();
   values.put(curThread, o); 
  }
  return o; 
 }

 public void set(Object newValue)
 {
  values.put(Thread.currentThread(), newValue);
 }

 public Object initialValue()
 {
  return null; 
 }
} 


注意这个initialValue方法,我们一般是要重写这个方法的。

下面是实例代码。

public class StringThread extends Thread{
    private ThreadLocal tl;
    private String threadName;
    public StringThread(ThreadLocal tl, String threadName){
    	this.tl=tl;
    	this.threadName=threadName;
    }
	@Override
	public void run() {
		if(this.tl!=null){
			for(int i=0;i<3;i++){
				StringBuffer sb=(StringBuffer)this.tl.get();
				sb.append("run");
				System.out.println(this.threadName+":"+this.tl.get());
			}
			
		}
	}
    
}


public class ThreadLocalTest {
	private ThreadLocal tl=new ThreadLocal(){
		@Override
		public Object get() {
			return super.get();
		}
		@Override
		protected Object initialValue() {
			return new StringBuffer();
		}
		@Override
		public void remove() {
			super.remove();
		}
		@Override
		public void set(Object arg0) {
			super.set(arg0);
		}
		
	};
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ThreadLocalTest tlt=new ThreadLocalTest();
		StringThread st1=new StringThread(tlt.tl,"thread 1 ");
		StringThread st2=new StringThread(tlt.tl,"thread 2 ");
		StringThread st3=new StringThread(tlt.tl,"thread 3 ");
		
		st1.start();
		st2.start();
		st3.start();
	}

}


运行结果是:
thread 3 :run
thread 2 :run
thread 1 :run
thread 2 :runrun
thread 3 :runrun
thread 2 :runrunrun
thread 1 :runrun
thread 3 :runrunrun
thread 1 :runrunrun
分享到:
评论

相关推荐

    Android ThreadLocal实现原理

    主要介绍ThreadLocal的原理,实例分析以及注意事项

    Java ThreadLocal用法实例详解

    主要介绍了Java ThreadLocal用法,结合实例形式详细分析了ThreadLocal线程局部变量相关原理、定义与使用方法,需要的朋友可以参考下

    深入理解ThreadLocal工作原理及使用示例

    主要介绍了深入理解ThreadLocal工作原理及使用示例,涉及ThreadLocal&lt;T&gt; 简介和使用示例及ThreadLocal的原理等相关内容,具有一定参考价值,需要的朋友可以了解下。

    leetcode下载-JavaTopic:Java面试题总结

    ThreadLocal的原理? spring事务7种传播特性和隔离级别的理解? spring boot的启动过程 spring事务实现的原理 aop切面 如何解决spring循环依赖问题? Redis篇: redis持久化的原理(RDB、AOF); redis缓存穿透、...

    Spring.3.x企业应用开发实战(完整版).part2

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

    Spring3.x企业应用开发实战(完整版) part1

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

    疯狂JAVA讲义

    11.7.1 画图的实现原理 418 11.7.2 使用Graphics类 419 11.8 处理位图 425 11.8.1 Image抽象类和BufferedImage实现类 425 11.8.2 使用ImageIO输入/输出位图 427 11.9 剪贴板 432 11.9.1 数据传递的类...

    Spring 2.0 开发参考手册

    3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.2. 实例化容器 3.2.3. 多种bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入依赖 3.3.2. 构造器参数的解析 3.3.3. bean属性及构造器参数详解 3.3.4. 使用depends-on...

    spring chm文档

    3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.2. 实例化容器 3.2.3. 多种bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入依赖 3.3.2. 构造器参数的解析 3.3.3. bean属性及构造器参数详解 3.3.4. 使用depends-on...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.1.1. 配置元数据 3.2.2. 实例化容器 3.2.2.1. 组成基于XML配置元数据 3.2.3. 多种bean 3.2.3.1. 命名bean 3.2.3.2. 实例化bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入...

    Spring API

    3.2. 基本原理 - 容器和bean 3.2.1. 容器 3.2.2. 实例化容器 3.2.3. 多种bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入依赖 3.3.2. 依赖配置详解 3.3.3. 使用depends-on 3.3.4. 延迟初始化bean 3.3.5. 自动...

    Spring中文帮助文档

    3.2. 基本原理 - 容器和bean 3.2.1. 容器 3.2.2. 实例化容器 3.2.3. 多种bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入依赖 3.3.2. 依赖配置详解 3.3.3. 使用depends-on 3.3.4. 延迟初始化bean 3.3.5. 自动...

    互联网创意产品众筹平台

    不多说,懂得人看名字就能知道,挺好的一套案例,包含讲解视频和完整案例。 内容: 『课程目录』: ├─众筹项目-第01天《Atcrowdfunding》3 n7 ]2 w M, M1 ^ ^& P │ ├─代码 - G( G, ]4 n, n! y3 k! o │ ├─...

    Java学习笔记-个人整理的

    {1.4.1.1}浮点数原理}{24}{subsubsection.1.4.1.1} {1.4.2}格式化输出浮点数}{24}{subsection.1.4.2} {1.4.3}\texttt {char}}{24}{subsection.1.4.3} {1.4.4}转义字符}{25}{subsection.1.4.4} {1.4.5}Boolean ...

    JAVA核心知识点整理(有效)

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

Global site tag (gtag.js) - Google Analytics