public class MyThreadLocal {
static class ThreadMain{
private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){
@Override
protected Integer initialValue() {
return 0 ;
}
};
/*
* ThreadLocal为每个使用该变量的线程提供独立的变量副本
* 每个线程都可以独立的改变自己的副本,不影响其他线程所对应的副本
* 目标变量就像是本地变量
*
* set 设置当前线程的线程局部变量的值
* get返回当前线程所对应的线程局部变量
* remove 将当前线程局部变量的值删除,线程结束后,该变量会自动被回收,使用该方法可以加快内存回收速度
* initialValue 返回该线程局部变量的初始值,
* 这个方法是一个延迟调用方法,在第一次get/set时才执行,只执行一次,缺省返回一个null
*
*/
/*
* ThreadLocal 实现了线程的变量拷贝
*
* 线程隔离的实现就是ThreadLocalMap这个类
* 是ThreadLocal类的一个静态内部类
* 实现了键值对的设置和取值
* 每个线程中都有一个独立的ThreadLocalMap副本
* 存储的值只能被当前线程读取和修改
* 每个线程只能操作自己的线程副本从而实现了线程隔离
*/
/*
* 在处理线程的局部变量的时候比synchronized同步机制解决线程安全问题更简单
* 结果程序拥有更高的并发性
* 一般都是声明在静态变量中的threadlocal
* 不断创建没有调用remove,将会导致内存泄漏
*/
public ThreadLocal<Integer> getThreadLocal() {
return seqNum;
}
public int getNextNum() {
seqNum.set(seqNum.get() +1);
return seqNum.get();
}
}
static class TestClient extends Thread {
private ThreadMain sn ;
public TestClient(ThreadMain sn) {
this.sn = sn;
}
@Override
public void run() {
for (int i = 0 ; i < 5 ;i++){
System.out.println(Thread.currentThread().getName()
+ ",sn = " + sn.getNextNum()
+ " ,id = " + Thread.currentThread().getId());
System.err.println();
sn.getThreadLocal().remove();
}
}
}
public static void main(String[] args) {
ThreadMain sn = new ThreadMain();
TestClient testClient = new TestClient(sn);
TestClient testClient2 = new TestClient(sn);
testClient.start();
testClient2.start();
}
}
java的ThreadLocal,了解一下
猜你喜欢
转载自blog.csdn.net/java_sparrow/article/details/81220672
今日推荐
周排行