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

龙岗区住房建设局网站h5 网站开发流程图

龙岗区住房建设局网站,h5 网站开发流程图,合肥网站seo报价,如何做品牌宣传与推广一、ThreadLocal 我们知道多线程访问同一个共享变量时#xff0c;会出现线程安全问题#xff0c;为了保证线程安全开发者需要对共享变量的访问操作进行适当的同步操作#xff0c;如加锁等同步操作。 除此之外#xff0c;Java提供了ThreadLocal类#xff0c;当一个共享变…一、ThreadLocal 我们知道多线程访问同一个共享变量时会出现线程安全问题为了保证线程安全开发者需要对共享变量的访问操作进行适当的同步操作如加锁等同步操作。 除此之外Java提供了ThreadLocal类当一个共享变量使用ThreadLocal声明时它表明当每个线程访问共享变量时会把共享变量复制一份到线程的工作内存之后线程对此共享变量进行操作时操作的都是线程工作内存的变量而不是主内存中的共享变量从而不需要加锁的同步操作实现避免出现线程安全问题。 二、Thread使用代码示例 public class ThreadLocalTest {private static ThreadLocalString variable new ThreadLocal(); // (1) public static void main(String[] args) throws InterruptedException {variable.set(Thread.currentThread().getName()); // (2)// 创建线程一var thread1 new Thread(() - {System.err.println(Thread Name before set: Thread.currentThread().getName() variable.get()); // (3)variable.set(Thread.currentThread().getName()); // (4)System.err.println(Thread Name after set: Thread.currentThread().getName() variable.get()); // (5)});var thread2 new Thread(() - {System.err.println(Thread Name before set: Thread.currentThread().getName() variable.get()); // (6)variable.set(Thread.currentThread().getName()); // (7)System.err.println(Thread Name after set: Thread.currentThread().getName() variable.get()); // (8)});thread1.start(); // (9)thread2.start(); // (10)Thread.sleep(2000); // (11)System.err.println(main thread: variable.get()); // (12)} }输出 Thread2 before set: Thread-1 null Thread2 after set: Thread-1 Thread-1 Thread1 before set: Thread-0 null Thread1 after set: Thread-0 Thread-0 main thread: main示例中我们创建了两个线程每个线程里都读取和设置全局的ThreadLcoal变量 代码1创建了一个ThreadLocal共享变量variable这里其实设置的是主线程工作内存里的共享变量副本 代码2主线程设置ThreadLocal变量variable 代码3线程一读取共享变量variable的值 代码4线程一设置共享变了variable的值这里其实设置的是线程一工作内存里的共享变量副本 代码5线程一再次读取共享变量variable的值 代码6线程二读取共享变量variable的值 代码7线程二设置共享变了variable的值这里其实设置的是线程二工作内存里的共享变量副本 代码8线程二再次读取共享变量variable的值 代码9启动线程一 代码10启动线程二 代码11主线程休眠2秒 代码12主线程读取共享变量variable的值 从输出我们可以看到每个两个线程所操作的ThreadLocal变量互不影响其实每个线程在设置和读取共享变量variable时操作的都是共享变量在线程自己工作内存里的副本并不会影响到其他线程的值。 三、ThreadLocal原理 我们说线程操作ThreadLocal类型的变量时会复制一个变量副本到线程工作空间然后所有操作都是对副本变量进行的。那线程是怎么复制ThreadLocal变量到线程工作空间的线程和ThreadLocal之前是怎么关联的。首先我们来看一看Thread的结构 可以看到Thread类有很多属性我们现在只关心threadLocals和inheritableThreadLocals这两个变量都是ThreadLocalMap类型的实例。TThreadLocalMap是一个ThreadLocal.ThreadLocalMap类型这是一个特殊的Map。 首先看一下在前面的例子中我们是怎么在线程中使用ThreadLocal变量的 variable.set(Thread.currentThread().getName()); // 设置ThreadLocal变量 variable.get(); // 读取ThreadLocal变量接下来我们看看ThreadLocal变量的set和get方法。 ThreadLocal.get()相关源码如下 public T get() {return get(Thread.currentThread()); // (1) }private T get(Thread t) {ThreadLocalMap map getMap(t); // (2)if (map ! null) {ThreadLocalMap.Entry e map.getEntry(this); // (3)if (e ! null) {SuppressWarnings(unchecked)T result (T) e.value;return result;}}return setInitialValue(t); // (4) }ThreadLocalMap getMap(Thread t) {return t.threadLocals; // (5) } 从代码1可以看到调用ThreadLocal的get()方法时会将当前线程作为参数传递。代码2调用getMap方法获取ThreadLocalMap类型变量如果map不为空则把ThreadLocal实例作为key获取值这个值就是ThreadLocal变量的值5可以看到getMap方法返回的就是Thread类型的threadLocals变量。根据上述分析我们可以知道 线程在读取ThreadLocal变量时实际是获取当前线程的threadLocals变量然后把ThreadLocal实例当做key从threadLocals查询对应的值。也就是说线程读取的ThreadLocal的实际值并不是存在ThreadLocal实例里的而是存在线程的threadLocals里面threadLocals是一个ThreadLocal.ThreadLocalMap这是一个特殊的Mapkey为ThreadLocal实例值为ThreadLocal变量的实际值。ThreadLoca相当于一个转接口连接Thread和ThreadLocal。 代码4可以看到如果当前线程的threadLocals变量为null会调用ThreadLocal的setInitialValue方法初始化当前线程的threadLocals实例。 private T setInitialValue(Thread t) {T value initialValue();ThreadLocalMap map getMap(t);if (map ! null) {map.set(this, value);} else {createMap(t, value);}if (this instanceof TerminatingThreadLocal? ttl) {TerminatingThreadLocal.register(ttl);}if (TRACE_VTHREAD_LOCALS) {dumpStackIfVirtualThread();}return value; }void createMap(Thread t, T firstValue) {t.threadLocals new ThreadLocalMap(this, firstValue); // (1) }setInitialValue方法会创建参数传递线程的threadLocals值并且设置一个初始化值。从代码(1)可以看到threadLocals的key为ThreadLocal实例。 下面再看看ThreadLocal的set方法 public void set(T value) {set(Thread.currentThread(), value); // (1)if (TRACE_VTHREAD_LOCALS) {dumpStackIfVirtualThread();} }private void set(Thread t, T value) {ThreadLocalMap map getMap(t);if (map ! null) {map.set(this, value);} else {createMap(t, value);} } 从代码(1)可以看到调用ThreadLocald的set方法会向当前线程的threadLocals变量里设置传递的值valuekey为ThreadLocal实例的引用和get方法一样如果当前线程的threadLocals变量为null则会创建一个ThreadLocalMap变量并把value设置为初始值。 总结在每个线程内部都有一个threadLocals变量该变量类型为ThreadLocal.ThreadLocalMap其中key为我们定义的ThreadLocal变量的this引用value则为我们使用set方法设置的值。每个线程的本地变量存放在线程自己的内存变量threadLocals中。 如果线程不销毁那么对应的本地变量就会一直存在所以可能存在内存溢出因此使用完毕之后要记得调用ThreadLocal的remove方法删除对应线程的threadLocals变量里的值。 注意ThreadLocal不具备继承性也就是说子线程并不能访问父线程的ThreadLocal变量。
http://www.hkea.cn/news/14338054/

相关文章:

  • 成都保障房中心官方网站建网站后如何维护
  • 网站运营与管理期末考试做免费网站怎么赚钱
  • 免费广告行业网站建设南昌做seo的公司有哪些
  • 天河网站建设网络推广建筑公司分公司
  • 怎么用手机创建网站成都做网站
  • 淘宝客怎么建网站做自媒体有哪些素材网站
  • 网站大部分都是jsp做的千度网站
  • 互联网金融网站建设网站建设教程纯正苏州久远网络
  • 网站 业务范围电商运营基础知识
  • 怎样做淘宝商品链接导航网站哪些行业做网站最重要
  • 徐州建筑网站个人衣服定制店铺
  • 移动端网站设计尺寸无锡网站建设楚天软件
  • 视频网站制作教程视频建立平台要多少钱
  • 江夏区做网站建筑行业最新资讯
  • 没有网站也可以做推广吗怎么给老板提供网站建设资料
  • 为什么网站打不开外贸如何开发客户的方式
  • 邯郸专业做网站地方可信赖的商城网站建设
  • 建设网站对公司起什么作用是什么意思网站建设的知识
  • 手机英语网站中国包装设计网
  • 长沙专业网站建设公司哪家好wordpress空间购买
  • 正能量不良网站软件下载东莞网站建设公司口碑排名
  • 滁州网站定制wordpress页眉描述
  • jsp网站建设项目实战 pdf百度云搜索引擎入口网盘搜索神器
  • 网站备案管谁要幕布建设网站费用入会计分录
  • 郑州的网站公司哪家好wordpress怎么恢复默然设置
  • 商机网网站源码长沙有什么好玩的
  • dede做的网站打不开建网站需要什么服务器
  • 国外注册品牌 建设网站wordpress页面修改插件
  • 藁城 网站青海省住房和城乡建设局网站
  • 做网站找图片做爰网站有哪些