当前位置: 首页 > news >正文

校友录网站开发设计搜狗引擎搜索

校友录网站开发设计,搜狗引擎搜索,郑州企业型网站建设,哈尔滨网站建设多少钱前面两篇文章,通过两阶段终止的模式进行优雅关闭线程,利用数据不变性的方式保证数据安全,以及基于COW的模式,保证读数据的安全。本篇我们来简述下如果利用线程本地存储的方式保证线程安全。 首先一个大前提就是并发问题&#xff…

前面两篇文章,通过两阶段终止的模式进行优雅关闭线程,利用数据不变性的方式保证数据安全,以及基于COW的模式,保证读数据的安全。本篇我们来简述下如果利用线程本地存储的方式保证线程安全。

首先一个大前提就是并发问题,其实就是多个线程之间读写共享数据,那么COW是通过将数据读和写分离。而从不共享数据的角度看,那么每个线程都存储一份数据。那么就不会存在线程安全。也就是说线程T1维护一个变量i 自己操作,而线程T2也维护一个变量i。 T1对i 操作,不会影响到T2的i值。

Java中就是通过ThreadLocal的方式实现。

实现原理

具体的工作原理就是线程Thread持有ThreadLocalMap变量,而ThreadLocalMap其实是ThreadLocal中的一个静态内部类。而ThreadLocalMap其实就是数组结构,key对应的线程this。value对应的是线程设置的值。
在这里插入图片描述


public class Thread implements Runnable {/*** ThreadLocal 的 ThreadLocalMap 是线程的一个属性,所以在多线程环境下 threadLocals 是线程安全的*/ThreadLocal.ThreadLocalMap threadLocals = null;}

public class ThreadLocal<T> {public T get() {// 返回当前 ThreadLocal 所在的线程Thread t = Thread.currentThread();// 从线程中拿到 ThreadLocalMapThreadLocalMap map = getMap(t);if (map != null) {// 从 map 中拿到 entryThreadLocalMap.Entry e = map.getEntry(this);// 如果不为空,读取当前 ThreadLocal 中保存的值if (e != null) {@SuppressWarnings("unchecked")T result = (T) e.value;return result;}}// 若 map 为空,则对当前线程的 ThreadLocal 进行初始化,最后返回当前的 ThreadLocal 对象关联的初值,即 valuereturn setInitialValue();}/*** 初始化 ThreadLocalMap,并存储键值对 <key, value>,最后返回 value** @return value*/private T setInitialValue() {// 获取为 ThreadLocal 对象设置关联的初值T value = initialValue();Thread t = Thread.currentThread();// 返回当前线程 t 持有的 mapThreadLocalMap map = getMap(t);if (map != null) {map.set(this, value);} else {// 为当前线程初始化 map,并存储键值对 <t, value>createMap(t, value);}return value;}/*** 为当前 ThreadLocal 对象关联 value 值** @param value 要存储在此线程的线程副本的值*/public void set(T value) {// 返回当前 ThreadLocal 所在的线程Thread t = Thread.currentThread();// 返回当前线程持有的mapThreadLocalMap map = getMap(t);if (map != null) {// 如果 ThreadLocalMap 不为空,则直接存储<ThreadLocal, T>键值对map.set(this, value);} else {// 否则,需要为当前线程初始化 ThreadLocalMap,并存储键值对 <this, firstValue>createMap(t, value);}}/*** 清理当前 ThreadLocal 对象关联的键值对*/public void remove() {// 返回当前线程持有的 mapThreadLocalMap m = getMap(Thread.currentThread());if (m != null) {// 从 map 中清理当前 ThreadLocal 对象关联的键值对m.remove(this);}}/*** 返回当前线程 thread 持有的 ThreadLocalMap** @param t 当前线程* @return ThreadLocalMap*/ThreadLocalMap getMap(Thread t) {return t.threadLocals;}

在这里插入图片描述
所以通过以上的方式可以保证每个线程内部保存一个Map数组,但是对应的key确实一个软引用,具体的介绍,另一篇文章有详细介绍就不说了总体上就是

【Java并发】从simpleDateFormart聊聊threadlocal原理机制

  • 对象的强软弱虚引用
  • threadlocal的原理
  • 对象内存泄漏

实际应用

因为threadlocal是和线程绑定的,所以可以很自然的就采用在线程级别做一些事情。

1.切换数据库
比如我们在切换数据的时候,就可以通过threadlocal进行操作。
比如当前默认就是从库,但是想要从主库切到从库上,就可以进行通过threadlocal进行使用。

        DynamicDataSourceHolder.setDataSourceTypeMaster();boolean updateResult;try {xxxxx // 业务代码} finally {DynamicDataSourceHolder.clearDataSourceType();}
public final class DynamicDataSourceHolder {private static ThreadLocal<String> threadLocal = new ThreadLocal();public static int dataSourceMasterSize;public static int dataSourceSlaveSize;private static Random random = new Random();private DynamicDataSourceHolder() {}public static String getDataSourceType() {if (null == threadLocal.get()) {setDataSourceTypeSlave();}return (String)threadLocal.get();}public static void setDataSourceTypeMaster() {threadLocal.set("MASTER");}public static void setDataSourceTypeSlave() {int randomSlave = random.nextInt(dataSourceSlaveSize);threadLocal.set("SLAVE" + (randomSlave + 1));}public static void clearDataSourceType() {threadLocal.remove();}
}

通过这种方式,可以很方便的进行切换数据库。

2.第二种场景
那就是比如我们需要针对线程级别进行添加整个链路的相关信息,或者存储相关数据。或者通过AOP注入的方式,前后执行一些方法。

好了今天比较简单,就到这里。

推荐阅读

保姆级教学,22张图揭开ThreadLocal

http://www.hrbkazy.com/news/53760.html

相关文章:

  • 阿里云服务器做美女网站seo培训价格
  • wordpress开发视频网站模板下载地址十大舆情网站
  • 网站建设工作情况总结百度竞价排名平台
  • 潍坊企业网站模板建站seo关键词排名
  • 能不能自己做视频网站发布软文广告
  • 东莞建网站公司品牌山东关键词优化联系电话
  • 深圳设计网站推荐网站注册流程和费用
  • 湘潭做网站价格 磐石网络刷赞抖音推广网站
  • 公司网站的开发和网版的重要性semseo是什么意思
  • 360网站怎么建设营销策划机构
  • 建设部门三类人员官方网站赣州是哪个省
  • 南京网站制作seo优化官网
  • 社交网站先做pc站可以吗广州疫情最新数据
  • 网站深度功能怎样注册网站免费注册
  • 最好的网站统计百度商店
  • 织梦网站突然打开很慢互动营销平台
  • 设计得好的美食网站在百度上打广告找谁
  • 如何做百度推广网站以服务营销出名的企业
  • 天津市经营性网站备案宁波网站制作设计
  • 网页设计师必须知道的网站app优化推广
  • 厦门企业网站建设补贴汕头seo建站
  • 海东营销网站建设百度热度指数排行
  • 租车网站建设seo基础知识培训
  • 培训行业网站建设的重要性百度竞价排名广告定价
  • 做电商设计有什么好的网站推荐百度seo排名优化软件分类
  • 做美团网站多少钱网站优化外包找谁
  • 温州 网站建设公司足球比赛直播
  • 网页制作教程appseo优化怎么做
  • logo设计网站参考今日新闻国际头条新闻
  • 网站上放的动画视频是怎么做的新闻发布稿