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

 

相关文章推荐

多线程编程入门(8):线程范围内的共享变量之ThreadLocal

package cn.itcast.heima2; import java.util.HashMap; import java.util.Map; import java.util.Random; ...

ThreadLocal简单Demo

  • 2017年10月17日 14:58
  • 131KB
  • 下载

Java并发编程--线程封闭(Ad-hoc、栈、ThreadLocal)

线程封闭(Thread Confinement):仅在单线程内访问数据,不需要同步。 常见应用是:JDBC(Java Database Connectivity)的Connection对象。 1.Ad...

ThreadLocal详解及说明

  • 2013年08月19日 14:10
  • 4KB
  • 下载

正确理解ThreadLocal.pdf

  • 2008年02月26日 11:29
  • 108KB
  • 下载

java并发编程——线程异常处理\资源共享的问题\ThreadLocal

过年在家的几天,因为没有网,也没有做笔记,今天一看自己写的多线程代码略感陌生。于是,从头再看一遍吧。 o(-“-)o Thread 到目前为之,我们应该清楚Thread只是你用来驱动任务(Runnab...
  • lemon89
  • lemon89
  • 2016年02月18日 01:07
  • 529

ThreadLocal源码分析

  • 2013年12月24日 23:22
  • 492KB
  • 下载

java 简单的ThreadLocal示例

  • 2013年03月24日 17:40
  • 6KB
  • 下载

ThreadLocal保证线程安全的原理

1、线程安全问题     这里我们主要关注的是Servlet的线程安全,我们知道Servlet是用来处理用户http请求的。当web容器接收到一个对Servlet的请求时,web容器就会分配一个工作...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ThreadLocal 入门
举报原因:
原因补充:

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