ThreadLocal 入门

原创 2013年12月04日 10:20:55

ThreadLocal类它代表一个线程的局部变量,通过把数据放在ThreadLocal中就可以让每个线程创建一个该变量副本,从而避免并发访问的线程安全问题。

 

ThreadLocal并不能替代同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是多个线程之间进行通信的有效方式;而ThreadLocal是为了隔离多个线程的数据共享,从根本上避免多个线程之间对共享资源(变量)的竞争,也就不需要对多个线程进行同步了。

 

通常我们认为:多个线程之间需要共享资源,以达到线程之间的通信功能,就使用同步机制;如果仅仅需要隔离多个线程之间的共享冲突,则可以使用ThreadLocal

 

package hb.threadlocal;

public class Account {

	private ThreadLocal<String> name = new ThreadLocal<String>();
	
	public Account(String str){
		this.name.set(str);
		System.out.println("---- " + this.name.get());
	}

	public String getName() {
		return name.get();
	}

	public void setName(String name) {
		this.name.set(name);
	}
	
	
}

 

package hb.threadlocal;


public class MyThread extends Thread {
	
	private Account account;
	
	public MyThread(Account account,String name){
		super(name);
		this.account = account;
	}
	
	public void run(){
		for(int i=0;i<10;i++){
			if(i==6){
				account.setName(getName());
			}
			System.out.println(account.getName()+"账户的i 值" + i);
		}
	}
}

 

package hb.threadlocal;

public class ThreadLocalTest {

	public static void main(String[] args) {
		Account at = new Account("huangbiao");
		
		new MyThread(at,"线程一").start();
		new MyThread(at,"线程二").start();
	}

}

 

备注:两个线程使用了同一个对象at,但是在两个线程中互不影响,因为两个线程使用的是两个完全相同的副本,即使修改了当前线程的内容,也不会影响到其他的线程。

 

思路:创建一个线程类,这个类中有ThreadLocal对象或者包含ThreadLocal作为属性的对象的作为属性,然后再启动线程,从ThreadLocal中获取共享的数据

 

运行结果:

---- huangbiao

null账户的i 值0

null账户的i 值1

null账户的i 值0

null账户的i 值1

null账户的i 值2

null账户的i 值3

null账户的i 值4

null账户的i 值5

线程二账户的i 值6

线程二账户的i 值7

线程二账户的i 值8

线程二账户的i 值9

null账户的i 值2

null账户的i 值3

null账户的i 值4

null账户的i 值5

线程一账户的i 值6

线程一账户的i 值7

线程一账户的i 值8

线程一账户的i 值9

 

Java学习记录--ThreadLocal使用案例

java学习记录–ThreadLocal使用案例标签(空格分隔): java最近整理公司项目,发现不少写的比较糟糕的地方,比如下面这个:public class DateUtil { priva...
  • u012706811
  • u012706811
  • 2016年11月19日 16:26
  • 1610

反驳:Threadlocal存在内存泄露

最近看到网上的一篇文章,分析说明ThreadLocal是如何内存泄露的. 但我不这么认为. ThreadLocal设计的很好,根本不存在内存泄露问题. 本文就结合图和代码的例子来验证我的看法. ...
  • kjfcpua
  • kjfcpua
  • 2013年03月14日 09:40
  • 1037

在web项目中使用 ThreadLocal 要谨慎,使用不当容易造成内存溢出

这里使用的servlet容器是 tomcat如果在web项目中,使用 ThreadLocal 不当,会造成 OutOfMemoryError。说明原因前 1:先讲一下 ThreadLocal,The...
  • liang_love_java
  • liang_love_java
  • 2016年09月29日 13:56
  • 2169

JDK源码解析之ThreadLocal类

本文通过对ThreadLocal源码解析来理解ThreaLocal
  • LClansefengbao
  • LClansefengbao
  • 2014年07月26日 14:10
  • 5454

解决SimpleDateFormat的线程不安全问题的方法:ThreadLocal

http://bijian1013.iteye.com/blog/1873336 http://blog.csdn.net/vking_wang/article/details/14225379
  • litefish
  • litefish
  • 2015年05月28日 11:40
  • 1197

ThreadLocal实现方式&使用介绍---无锁化线程封闭 (r)

http://blog.csdn.net/xieyuooo/article/details/8599266      关注哈下面的提问 虽然现在可以说很多程序员会用ThreadLocal,但是...
  • wangtaomtk
  • wangtaomtk
  • 2016年09月05日 16:54
  • 495

Android的消息机制之ThreadLocal的工作原理

提到消息机制大家应该都不陌生,在日常开发中不可避免地要涉及到这方面的内容。从开发的角度来说,Handler是Android消息机制的上层接口,这使得开发过程中只需要和Handler交互即可。Handl...
  • singwhatiwanna
  • singwhatiwanna
  • 2015年09月10日 21:54
  • 23796

Java学习整理系列之ThreadLocal的理解

在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问...
  • Sup_Heaven
  • Sup_Heaven
  • 2014年06月11日 20:30
  • 5308

ThreadLocal的内存泄漏问题

在最近一个项目中,在项目发布之后,发现系统中有内存泄漏问题。表象是堆内存随着系统的运行时间缓慢增长,一直没有办法通过gc来回收,最终于导致堆内存耗尽,内存溢出。开始是怀疑ThreadLocal的问题,...
  • zsfsoftware
  • zsfsoftware
  • 2016年03月19日 21:22
  • 1225

深入理解ThreadLocal

一. ThreadLocal是什么? ThreadLocal,顾名思义,它不是一个线程,而是线程的一个本地化对象。当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每...
  • zdp072
  • zdp072
  • 2014年09月09日 14:22
  • 2479
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ThreadLocal 入门
举报原因:
原因补充:

(最多只允许输入30个字)