ThreadLocal的使用

来源:互联网 发布:超级基因优化液无弹窗 编辑:程序博客网 时间:2024/06/10 14:57
/**
 *目的:线程封闭的方式做变量管理。
 *实现:用一个map存储数据key:使用线程  value:数组   (atomicInteger+魔数) 形成hash表示数组下标       
 *算法:开地址算法
 *替换:无状态本地方法。线程局部变量
 *感想:对于线程不安全是由于共享数据导致。
 *应该养成的习惯:全局变量的使用比局部变量的使用更加容易出问题。
 *对于数据的get/set会触发回收机制
 */
public class MyThreadLocal {
private static ThreadLocal<Object> tl = new  ThreadLocal<Object>();


public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
tl.set("我是渣渣!");
System.out.println(this.hashCode()+"|"+tl.get());
try {
TimeUnit.SECONDS.sleep(3L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.hashCode()+"|"+tl.get());
Thread t3 = new Thread(new Runnable() {
public void run() {
System.out.println(this.hashCode()+"ss|ss"+tl.get());
try {
TimeUnit.SECONDS.sleep(3L);
} catch (InterruptedException e) {
}
}
});
t3.start();
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
tl.set("我是渣渣2!");
System.out.println(this.hashCode()+"|"+tl.get());
try {
TimeUnit.SECONDS.sleep(3L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.hashCode()+"|"+tl.get());
}
});

t1.start();
t2.start();
System.out.println("ssssssssssssssssssssssssssssssss");
System.out.println(t1.hashCode()+"|"+tl.get());
}
}
1 0