package com.tan.thread.ThreadLocal;
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 str) {
this.name.set(str);
}
}
class MyTest extends Thread {
private Account account;
public MyTest(String name, Account account) {
super(name);
this.account = account;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if(i==6){
account.setName(getName());
}
System.out.println(account.getName()+"账户i的值:"+i);
}
}
}
/** * 线程相关类 * ThreadLocal:线程局部变量 作用:为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程可以独立的修改自己 的副本而不会和其他线程的副本发生冲突。 * ThreadLocal的3个public方法: |-T get() |-void remove() |-void set(T value) * * ThreadLocal * * 目的:为了解决多线程对同一变量的访问冲突 * * 现象:2个线程在进行循环i=6时会将线程名改为与用户名相同 * * 结果:实际上账户名有3个副本,主线程一个,另外2个线程各一个,它们的值互不干扰,每个线程拥有自己的独立的线程局部变量。 * * 结论:如果多个线程之间需要共享资源以达到线程之间的通信功能就可以使用同步机制,如果仅仅是为了隔离多个线程之间的共享冲突就可以使用ThreadLocal. */
public class ThreadLocalTest {
public static void main(String[] args) {
Account account=new Account("初始名");
new MyTest("线程A", account).start();
new MyTest("线程B", account).start();
}
}