`

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
分享到:
评论

相关推荐

    ThreadLocal应用示例及理解

    ### 理解ThreadLocal原理 ThreadLocal内部通过一个ThreadLocalMap来存储每个线程的副本。这个Map的键是ThreadLocal实例,值是线程的局部变量。每个线程都有自己的ThreadLocalMap,存储在Thread类的成员变量中。 ##...

    ThreadLocal 内存泄露的实例分析1

    at 中专门为每一个 web 应用...理解 `ThreadLocal` 的工作原理以及它如何与类加载器交互,是避免此类问题的关键。在实际开发中,应当养成良好的编程习惯,如使用后及时清理 `ThreadLocal` 变量,以防止内存资源的浪费。

    ThreadLocal原理及在多层架构中的应用

    ThreadLocal的工作原理主要基于以下几点: - **内部类ThreadLocalMap**:ThreadLocal在每个线程内部维护了一个名为ThreadLocalMap的哈希映射表,这个表的键是ThreadLocal对象,值是线程局部变量的实际值。这样,每...

    ThreadLocal原理及在多层架构中的应用.pdf

    首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程可以拥有自己独立的数据副本,而不会与其他线程共享。这意味着,即使多个线程访问相同的变量,它们也各自拥有这个变量...

    深入理解 Java 之 ThreadLocal 工作原理1

    ThreadLocal是Java中用于线程局部变量的一个工具类,它的工作原理主要体现在如何在不同的线程之间隔离变量的副本,确保每个线程拥有自己的独立...理解和掌握ThreadLocal的工作原理对于编写高效并发的Java程序至关重要。

    ThreadLocal

    - 不是线程安全的:尽管ThreadLocal提供了线程隔离,但它本身并不保证线程安全性,如果在`set`和`get`操作之间有其他线程修改了ThreadLocal实例,仍需进行同步控制。 在使用ThreadLocal时,理解其工作原理和限制是...

    JDK的ThreadLocal理解(一)使用和测试

    **标题:“JDK的ThreadLocal理解(一)使用和测试”** **正文:** ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个...

    Java 并发编程之ThreadLocal详解及实例

    下面将详细探讨 ThreadLocal 的工作原理、使用方法以及适用场景。 1. **ThreadLocal 工作原理** - 每个 `ThreadLocal` 实例在每个线程中都有一个对应的存储槽,这个存储槽存储的是变量的副本。当创建一个新的 `...

    java 简单的ThreadLocal示例

    Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...

    Java ThreadLocal用法实例详解

    Java ThreadLocal用法实例详解 Java ThreadLocal是Java中的一种线程局部变量机制,用于保存每个线程独有的数据,以避免线程之间的数据共享问题。ThreadLocal的基本使用非常简单,只需要定义一个ThreadLocal变量,...

    ThreadLocal的用处

    ThreadLocal是Java编程语言中的一个强大工具,它主要用于在多线程环境中为每个线程提供独立的变量副本。这个机制确保了线程之间的数据隔离,避免了共享...了解其工作原理和最佳实践对于编写高质量的并发代码至关重要。

    java中ThreadLocal详解

    #### 二、ThreadLocal的数据结构及实现原理 `ThreadLocal`的核心数据结构是`ThreadLocalMap`。`ThreadLocalMap`本质上是一个哈希表,它使用了弱引用(Weak Reference)作为键,实现了对线程局部变量的存储。具体来...

    java 中ThreadLocal实例分析

    ThreadLocal 的工作原理是,将变量存储在 ThreadLocalMap 中,每个线程都有自己的 ThreadLocalMap,用于存储该线程专有的变量副本。这样,当多个线程访问同一个变量时,每个线程都会访问自己的变量副本,从而实现...

    Java中ThreadLocal的设计与使用

    理解ThreadLocal的工作原理和使用方法对于编写高效、安全的多线程程序至关重要。 ### ThreadLocal简介 ThreadLocal并非一个线程对象,而是一个线程局部变量的容器。每个线程都有自己的ThreadLocal实例,它们各自...

    ThreadLocal_ThreadLocal源码分析_

    **ThreadLocal概述** ThreadLocal是Java中的一个线程局部变量类,它...通过理解ThreadLocal的原理和最佳实践,我们可以更有效地利用它来解决多线程环境下的数据隔离问题,同时也需要注意防止可能出现的内存泄漏风险。

    threadLocal

    以上内容涵盖了从ThreadLocal原理到其在实际开发中的应用,以及相关的多线程、并发编程、HTTP通信等知识点。通过阅读和理解这些资料,开发者可以深化对ThreadLocal的理解,并将其有效地应用于项目中。

    ThreadLocal的几种误区

    总之,ThreadLocal是一个强大的工具,但理解其工作原理和潜在风险至关重要。正确使用ThreadLocal可以提高代码的并发性能,而滥用则可能导致难以预料的问题。因此,在使用ThreadLocal时,需要充分考虑其生命周期管理...

    java中ThreadLocal类的使用

    Java中的`ThreadLocal`类是一个非常实用的工具,它提供了线程局部变量的功能。线程局部变量意味着每个线程都拥有...通过理解和掌握`ThreadLocal`的工作原理,我们可以更有效地利用它来优化多线程程序的性能和可维护性。

    正确理解ThreadLocal.pdf

    ### 正确理解ThreadLocal:深入解析其工作原理与应用场景 #### 一、ThreadLocal的基本概念 `ThreadLocal`是Java平台提供的一种线程局部变量的解决方案,它为每一个使用该变量的线程都提供了独立的变量副本,使得每...

Global site tag (gtag.js) - Google Analytics