ThreadLocal 用法通俗理解

也许你们都遇见过一种情况,已经开发好的情况下,突然项目框架变动

 

例如:因为瓶颈问题,数据库需要分库了,以前的客户库需要变成 客户库1   客户库2  

本来以前所有的客户都放在一个库,用一个数据库链接就好了。

但是现在需要根据客户的企业标识来切换数据源。

拿jdbctemplate举例,以前一个库的时候只需要jdbctemplate.update(sql);

jdbctemplate的数据源只有一个DataSource

可是两个库,需要配置两个DataSource

那么jdbctemplate.update(sql);的时候就需要知道 切换到哪个DataSource中,可是怎么办呢?

一般人就会把jdbctemplate的源码改了,把所有的方法都加一个参数,变成jdbctemplate.update(sql,企业标识符);

在源码中判断 

if(企业标识.equals("客户库1"))切换客户库1的数据库链接。

那你以前的代码是不是都要改过去。

显然是不明智的。

这个时候使用ThreadLocal就很明智了。

先看一个图:

图上看不明白?那我们来看一个简单的代码。

public final static ThreadLocal<String> s = new ThreadLocal<String>();
	public static void main(String[] args) {
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				s.set("123");
				try {
					Thread.sleep(10000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(s.get());
			}
		}).start();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				s.set("456");
				
				
				System.out.println(s.get());
			}
		}).start();
	}

可以拿出来运行,发现两个线程中,s里的String值,不会并发。是线程安全的。

大家看完可以互相讨论下。谢谢!

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫川琴秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值