ThreadLocal 入门

来源:互联网 发布:igbt芯片 知乎 编辑:程序博客网 时间:2024/06/04 18:43

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

 
原创粉丝点击