您的位置:首页 > 其它

二、线程相关类ThreadLocal

2015-10-19 10:46 288 查看
/*
* Creation : 2015年10月17日
*/
package com.tan.thread.ThreadLocal;

class Account {

// ①创建线程局部变量:name
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();

}

}

/*
---->初始名       -->主线程访问 有一个默认值
null账户i的值:0
null账户i的值:1
null账户i的值:2
null账户i的值:3
null账户i的值:4
null账户i的值:5
线程A账户i的值:6  -->i==6后  第一个线程在这个时候被赋值
线程A账户i的值:7
线程A账户i的值:8
线程A账户i的值:9
null账户i的值:0
null账户i的值:1
null账户i的值:2
null账户i的值:3
null账户i的值:4
null账户i的值:5
线程B账户i的值:6 -->i==6后  第二个线程在这个时候被赋值
线程B账户i的值:7
线程B账户i的值:8
线程B账户i的值:9

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Thread