ThreadLocal 入门

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

 
阅读更多
个人分类: 多线程 & thread
想对作者说点什么? 我来说一句

理解ThreadLocal

2017年12月29日 1.94MB 下载

ThreadLocal的几种误区

2008年10月17日 26KB 下载

没有更多推荐了,返回首页

不良信息举报

ThreadLocal 入门

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭