ThreadLocal的使用

ThreadLocal线程副本,可以理解为一种线程变量,作用域为当前线程,数据存放在ThreadLocal可以一个线程内共享。好处是避免了层与层之间的参数传递,实现松耦合。

public class SessionContainer {
	private static final ThreadLocal<SessionCache> sessionThreadLocal = new ThreadLocal<SessionCache>();
	public static SessionCache getSession() {
		return sessionThreadLocal.get();
	}
	public static void setSession(SessionCache sessionCache) {
		sessionThreadLocal.set(sessionCache);
	}
	public static void clear() {
		sessionThreadLocal.set(null);
	}
}

 

public class Global {
	public static final ThreadLocal transferThreadLocal = new ThreadLocal();
	public static Map<String, Object> getTransfer() {
		Map<String, Object> map = (Map<String, Object>) transferThreadLocal.get();
		if (map == null) {
			map = new HashMap<String, Object>();
			transferThreadLocal.set(map);
		}
		return map;
	}

	public static void setTransfer(String key, Object value) {
		Map<String, Object> map = getTransfer();
		map.put(key, value);
		transferThreadLocal.set(map);
	}
}
public class Test{
    public static void main(String[] args){
        Map<String, Object> transferMap = Global.getTransfer();
        transferMap.put("host", Global.getValue("weburl"));
        transferMap.put("webname", Global.getValue("webname"));

        Global.setTransfer("user", user);
    }
}

首先,ThreadLocal 不是用来解决多线程资源访问的,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是访问不到的。各个线程中访问的是不同的对象。 以下测试返回结果:

t2 com.sunyard.util.ThreadLocal2$Person@152236d9
t1 null
public class ThreadLocal2 {
	static ThreadLocal<Person> tl = new ThreadLocal<>();
	public static void main(String[] args) {
		new Thread(()->{
			try {
				TimeUnit.SECONDS.sleep(2);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+" "+tl.get());
		},"t1").start();
		
		new Thread(()->{
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			tl.set(new Person());
			System.out.println(Thread.currentThread().getName()+" "+tl.get());
		},"t2").start(); 
	}
	static class Person {
		String name = "zhangsan";
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值