ThreadLocal 用法通俗理解

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

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

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

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

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

jdbctemplate的数据源只有一个DataSource

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

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

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

在源码中判断 

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

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

显然是不明智的。

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

先看一个图:

ThreadLocal 用法通俗理解_第1张图片

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

public final static ThreadLocal s = new ThreadLocal();
	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值,不会并发。是线程安全的。

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

你可能感兴趣的:(JAVA,JAVA,ThradLocal,线程安全,本地线程)