博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThreadLocal
阅读量:6572 次
发布时间:2019-06-24

本文共 1325 字,大约阅读时间需要 4 分钟。

  ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。

  ThreadLocal类接口很简单,只有4个方法,我们先来了解一下:

  • void set(Object value)设置当前线程的线程局部变量的值。
  • public Object get()该方法返回当前线程所对应的线程局部变量。
  • public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
  • protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。

  在项目中ThreadLocal最直接的使用就是分库了:

  

private static final ThreadLocal
contextHolder = new ThreadLocal<>();/** * 设置数据源 * @param dataSource */ public static void setDataSource(String dataSource) { contextHolder.set(dataSource); }/** * 获取数据源 * @return */ public static String getDataSource() { String dataSource = contextHolder.get(); // 如果没有指定数据源,使用默认数据源 if (null == dataSource) { DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getDefault()); } return contextHolder.get(); }/** * 清除数据源 */ public static void clearDataSource() { contextHolder.remove(); }

 

转载于:https://www.cnblogs.com/yangfei-beijing/p/7205576.html

你可能感兴趣的文章
Enhanced VMotion Compatibility (EVC) 功能介绍和实战设置
查看>>
RabbitMQ 流控制学习
查看>>
Ubuntu16.04 ssh安及root登录
查看>>
算法导论Java实现-优先级队列(6.5章节)
查看>>
一个工程两个target
查看>>
linux 给文件夹权限
查看>>
用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题
查看>>
求连续子数组的最大和
查看>>
C语言dos程序源代码分享(进制转换器)
查看>>
php项目中常用的log日志记录方法
查看>>
Android--实现点击一次返回键返回桌面而不是退出应用
查看>>
LogParser 导入MSSQL
查看>>
左侧固定导航栏
查看>>
linux安装go环境并编写第一个go程序
查看>>
解决:laravel出现Please provide a valid cache path.
查看>>
[JAVA] String常用方法
查看>>
oracle
查看>>
兼容IE浏览器样式的html上传文件控件
查看>>
直接插入排序
查看>>
ssh建立安全跳板机,方便外网登录内网机器
查看>>