电子商务网站有哪些和网址工商注册推荐

张小明 2026/1/11 16:49:52
电子商务网站有哪些和网址,工商注册推荐,石家庄百度推广电话,品优购html代码hreadLocal是什么#xff1f;thread是线程#xff0c;local是本地的意思字面意思是线程本地。其实更通俗的理解是给每个线程设置一个缓存。这个缓存用来存储当前线程在未来的业务逻辑中需要执行到的变量。我们先来看怎么用#xff1a;首先创建全局变量ThreadLocal#xff0…hreadLocal是什么thread是线程local是本地的意思字面意思是线程本地。其实更通俗的理解是给每个线程设置一个缓存。这个缓存用来存储当前线程在未来的业务逻辑中需要执行到的变量。我们先来看怎么用首先创建全局变量ThreadLocal各自启动一个线程任务线程任务将变量设置到缓存中。线程任务需要用到缓存中的变量时直接从缓存中取即可。复制代码1 import java.util.concurrent.TimeUnit;23 /**4 * discription5 */6 public class ThreadLocalLearn {7 static ThreadLocalString threadLocal new ThreadLocal();89 public static void main(String[] args) {10 Runnable r new Runnable() {11 Override12 public void run() {13 threadLocal.set(Thread.currentThread().getName());14 sayMyName();15 threadLocal.remove();16 }1718 public void sayMyName() {19 for (int i 0; i 3; i) {20 String name threadLocal.get();21 System.out.println(Thread.currentThread().getName() say: im a thread, name: name);22 try {23 TimeUnit.SECONDS.sleep(3);24 } catch (Exception e) {25 //...26 }27 }28 }29 };30 Thread t1 new Thread(r);31 t1.start();32 Thread t2 new Thread(r);33 t2.start();34 }35 }复制代码它的使用非常简单1先set()存储值2使用时get()取出值3用完了使用remove()清理掉输出如下复制代码Connected to the target VM, address: 127.0.0.1:56863, transport: socketThread-0 say: im a thread, name:Thread-0Thread-1 say: im a thread, name:Thread-1Thread-0 say: im a thread, name:Thread-0Thread-1 say: im a thread, name:Thread-1Thread-1 say: im a thread, name:Thread-1Thread-0 say: im a thread, name:Thread-0Disconnected from the target VM, address: 127.0.0.1:56863, transport: socket复制代码很多人第一次见到ThreadLocal第一直觉它的实现是用MapThread,Object 。(防盗连接本文首发自http://www.cnblogs.com/jilodream/ )但是深入研究之后你会发现threadLocal的实现要比这样一个map 精妙的多也好用的多。我们通过查看java源码可以依次探索ThreadLocal是如何实现缓存的类整体的关系大概是这样的tlleitu查看源码我们可以发现如下特性1、ThreadLocal本身并不是缓存它只是起到一个缓存的key 的作用。我们每次创建一个ThreadLocal 并不是真正的创建了一个缓存其实只是创建了一个缓存的标识。源码如下this 就是ThreadLocal实例复制代码1 public void set(T value) {2 Thread t Thread.currentThread();3 ThreadLocalMap map getMap(t);4 if (map ! null) {5 map.set(this, value);6 } else {7 createMap(t, value);8 }9 }复制代码2、真正的缓存保存在Thread中缓存被定义为:ThreadLocal.ThreadLocalMap threadLocals;从名字可以发现这个缓存的类型是在ThreadLocal 中定义的一个静态内部类。这个类就是用来真正存放缓存的地方。这就像是thread小书包一样每个线程有一个自己的独立的存储空间。设计疑问它ThreadLocalMap为什么没有定义在Thread类中毕竟它是Thread的缓存。源码如下Thread.java1 /* ThreadLocal values pertaining to this thread. This map is maintained2 * by the ThreadLocal class. */3 ThreadLocal.ThreadLocalMap threadLocals null;3、查看ThreadLocalMap的源码我们发现它并没有实现Map接口就像其他map一样ThreadLocalMap实现了常用的Map中的setgetgetEntrysetThresholdremove 等方法。并且它内部使用了线性探测法来解决哈希冲突。设计疑问它ThreadLocalMap为什么没有实现Map接口源码如下ThreadLocal.Java复制代码1 static class ThreadLocalMap {23 //...45 private static final int INITIAL_CAPACITY 16;678 private Entry[] table;91011 private int size 0;121314 private int threshold; // Default to 0151617 private void setThreshold(int len) {18 threshold len * 2 / 3;19 }202122 private Entry getEntry(ThreadLocal? key) {23 ...24 }25262728 private void set(ThreadLocal? key, Object value) {29 ...30 }313233 private void remove(ThreadLocal? key) {34 ...35 }363738 private void rehash() {39 ...40 }4142 private void resize() {43 ...44 }45 ....46 }复制代码4、继续看源码我们发现ThreadLocalMap类像其他Map实现一样在内部定义了Entry。并且这个Entry居然继承了弱引用弱引用被定义在Entry的key上而且key的类型是ThreadLocal。至于什么是弱引用我以前的文章中介绍过请看浅谈Java中的引用 https://www.cnblogs.com/jilodream/p/6181762.html一定要对弱引用了解否则ThreadLocal的核心实现以及它会存在的问题就无法更深理解了。这里又会有疑问为什么要使用弱引用使用强引用不好吗弱引用万一被回收导致空引用等问题怎么办源码如下ThreadLocal.Java复制代码1 static class Entry extends WeakReferenceThreadLocal? {2 /** The value associated with this ThreadLocal. */3 Object value;45 Entry(ThreadLocal? k, Object v) {6 super(k);7 value v;8 }9 }复制代码我们依次回答这几个问题1设计疑问它ThreadLocalMap为什么没有定义在Thread类中毕竟它是Thread的缓存这恰恰是Thread符合开闭原则的优秀设计。如果是将ThreadLocalMap添加到Thread中那么Thread类就太重了以后只要和线程相关的业务都要将代码添加到Thread中那Thread就无限膨胀了变成超级类了试想什么业务和线程能脱离关系呢况且他们只是类依赖关系而不是组合关系对类关系不了解的同学可以看我的这篇文章统一建模语言UML---类图 https://www.cnblogs.com/jilodream/p/16693511.html。Map怎么实现缓存怎么维护这些都是Thread不需要考虑的我们就是需要用到你的特性。2设计疑问它ThreadLocalMap为什么没有实现Map接口实现接口是为了统一化提供接口让外界可以只依赖接口而不是接口的实现。但是ThreadLocalMap并不是给外界使用的并不需要暴露出来。他就是为了给ThreadLocal业务使用的。只要完成最核心的Map能力用空间换时间将理论时间复杂度推向O(1)即可。因此完全没有必要实现Map接口。实现了Map接口反而要将内部方法暴露为public这也不符合最少知道原则。一句话就是没必要还添乱。3为什么要使用弱引用使用强引用不好吗弱引用万一被回收导致空引用等问题怎么办我们需要先了解弱引用的特性当一个变量只有弱引用关联时那么在下次GC回收时不论我们内存是否足够都将回收掉该内存。第一眼感觉这很危险毕竟我们非常担心就是一个变量用着用着突然不能用了出现空引用了漫天的空引用这太不可控了。其实这完全多虑了注意看我们是如何使用缓存的是通过threadlocal.get(),也就是说我们想要使用缓存就一定要使用threadlocal的实例也就是强引用有了强引用使用时就一定不会被回收。因此完全不用担心使用缓存中弱引用key突然变为null的情况了。那什么时候弱引用key会被回收呢这就是当外界的强引用被手动设置为null时(防盗连接本文首发自http://www.cnblogs.com/jilodream/ )或者是作为局部变量跳出了方法栈超出生命周期被回收掉了。试想一下真要是发生这两种情况那么其实这个缓存也就根本无法再用到了同时key被尽快回收反而对内存更有利。那么弱引用这么好用为什么value不设置为弱引用呢其实细想一下就会发现value一定不能设置为弱引用为什么呢key设置为弱引用是因为想要使用这个缓存key就一定要有强引用关联。而value则不一定有外界强引用关联它在外界的强引用可能早就消失了。比如下面这个例子复制代码1 import java.util.concurrent.TimeUnit;23 /**4 * discription5 */6 public class ThreadLocalLearn {7 static ThreadLocalUserInfo userContext new ThreadLocal();89 public static void main(String[] args) {10 Runnable r new Runnable() {11 Override12 public void run() {13 setUserInfo();14 handle();15 userContext.remove();16 }1718 public void handle() {19 UserInfo user userContext.get();20 //注意倘若map中的value被定义为弱引用则此处的user可能为null21 System.out.println( i am: user.toString());22 //do sth23 try {24 TimeUnit.SECONDS.sleep(3);25 } catch (Exception e) {26 //...27 }28 }29 };30 Thread t1 new Thread(r);31 t1.start();32 Thread t2 new Thread(r);33 t2.start();34 }3536 private static void setUserInfo() {37 UserInfo user new UserInfo();// 假装是从db中获取的38 userContext.set(user);39 //跳出该方法后userInfo的在外部的直接强引用就被回收了40 }41 }4243 class UserInfo {44 private String name;45 private int age;4647 //....48 }复制代码我们在A方法中设置了缓存 currentUserId跳出A方法currentUserId在外界的引用被断开倘若此时value也被定义为弱引用value就随时可能被回收。而我们又可以通过(key)Threadlocal -- threadLocals(ThreadLocalMap) -- entry -- value这样的调用关系来拿到缓存value。这样缓存的使用就不可控了。那么value一定不能设置为弱引用或及时回收么并不是其实我们只要在key回收时顺手对value也做一个回收但是这是GC完成的再key消失时联动对所有线程中关联的Map都进行一遍清理。实现过于复杂亦或者清理keythreadlocal的强引用时将value的强引用也一并被清理。可行也是ThreadLocal推荐的方式需要手动调用ThreadLocal.remove 方法。在调用remove方法后ThreadLocalMap会对所有垃圾数据进行清理还会压缩哈希表。为了解决ThreadLocalMap的value 延迟清理的情况ThreadLocalMap在set get remove等方法中都会对ThreadLocalMap存在的这种null,Object 垃圾数据进行一定程度的清理注意这里要分各种情况具体只能详细分析源码了一篇博文很难说清。(4)这样又会有一个新的问题如果key 被回收了但是value没有被回收因此value就常驻内存了那么value不就会导致内存泄露吗很不幸这样的确是会导致内存的泄露。这里简单提一下java中的内存泄露是指可以通过强引用关联到他gc无法回收掉它。与此同时业务按照正常逻辑又无法使用到它。也就是又用不到又回收不掉就称之为内存泄露但是这种内存泄露出现的概率非常低。它需要同时满足以下三个条件才可以1、需要线程的生命周期永远不会结束。如果线程生命周期结束了那么ThreadLocalMap就会被回收里边出现的无其他关联的key value 也都会被回收。这种一般是守护线程或者线程池线程复用出现2、ThreadLocal在设置为null时没有手动调动remove方法3、线程中的ThreadLocalMap在后续使用中没有再调用任何get set remove方法也就是线程没再使用ThreadLocal概率低是不是代表不太需要关注当然不是。因为内存泄露不仅仅是减少了可用内存还增加了GC负担系统性能就会收到影响这就说的远了。其实ThreadLocal最大的问题并不是泄露的问题而是被滥用的问题不规范使用的问题。很多人把ThreadLocal当成是线程的私有仓库所有变量参数都往里边塞导致写代码和维护时非常不方便出现问题也给维护人员造成很大的困扰。接下来我们简单说下ThreadLocal的使用后边我会再写一篇如何使用ThreadLocal毕竟我们学习技术目的是能够驾驭它而不仅仅是知其所以然我们一般是将上下文信息或者当前需要频繁使用的与实际业务直接关系不大的系统数据方便携带。放置到thread的小书包中。1上下文信息如我们在controller层将用户的上下文信息传入如traceId方便链路追踪如用户token后续可能调用其他鉴权接口等2解耦数据库连接等连接池信息比如Springboot运行事务时我们每次getconnection()就只使用ThreadLocal中贮存好的这个连接整个方法使用的是同一个数据库连接。以上场景不使用ThreadLocal可以吗也可以他并不是一定要使用。但是你这样就要把很多的参数传来传去暴露很多的问题。甚至在很多第三方实现的框架中他不支持你传这些参数他就是要用通过ThreadLocal来回传值。3为线程安全提供了方案减少了锁竞争如果说锁是从资源竞争的角度解决了数据安全的问题。ThreadLocal则是在每个线程中只保存只隔离出与自己当前业务相关的数据。注意他只是保证了数据的独立性并不是独立创建了一份副本(防盗连接本文首发自http://www.cnblogs.com/jilodream/ )所以如果使用全局数据放置到value中时一样可能会有数据安全问题。当然这也是不推荐的用法比如有一份UserCache的全局缓存多线程使用时我可以在全局中对UserCache进行加锁处理也可以每个线程独立引用自己的UserInfo线程之间互不干扰。结构就像这个样子全局加锁tljingzheng线程各自引用tlyinyong不知讲到这里大家还有没有最初的直觉了为啥不设计一个全局的 MapThread,Object。这样不是更简单也更好定位问题细想一下就会发现这样并不好方案1全局只有一个Mapvalue是当前线程的所有缓存数据。那么Object就是一个非常复杂的数据每次对Object进行读取都要解析的
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做外贸网站报价单国内wordpress主题网站

它们是嵌入式系统和电子设备中两种最重要、最常用的串行通信协议,用于在芯片之间进行短距离、板级的数据交换。 我们可以把它们想象成设备之间“对话”的两种不同方式,各有各的规则和适用场景。 1、I2C(Inter-Integrated Circuit,集成电路总线) I2C是一种多主从、半双工…

张小明 2026/1/11 11:48:37 网站建设

天津网站制作公司网站开发专业的

SeedVR视频修复工具:让模糊视频重获新生 【免费下载链接】SeedVR-7B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/SeedVR-7B 您是否曾经为那些珍贵的家庭录像画质模糊而遗憾?那些记录着重要时刻的视频,因为年代久远…

张小明 2026/1/10 2:09:49 网站建设

网站项目申报书建设规模wordpress 高级选项

ComfyUI自定义节点开发:连接VoxCPM-1.5-TTS语音引擎 在内容创作与人机交互日益依赖自然语言表达的今天,高质量语音合成已不再是科研实验室里的高冷技术,而是逐步渗透进教育、播客、虚拟主播甚至家庭助手等日常场景。然而,大多数先…

张小明 2026/1/11 11:40:10 网站建设

网站中英文切换怎么做北京海淀区居家办公

HUSTOJ终极部署教程:打造高效在线编程竞赛平台的完整指南 【免费下载链接】hustoj 项目地址: https://gitcode.com/gh_mirrors/hu/hustoj HUSTOJ作为一款源自华中科技大学的开源在线编程竞赛系统,为教育工作者和编程爱好者提供了完整的编程评测解…

张小明 2026/1/10 13:02:03 网站建设

网站建设合同docwordpress评论 边栏

目录具体实现截图项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理具体实现截图 本系统(程序源码数据库调试部署讲解)带文档1万字以上 同行可拿货,招校园代理 Thinkphp和Laravelvue全家桶的零食商城网上商店购物系统设计与…

张小明 2026/1/11 15:55:58 网站建设

嘉兴制作网站企业大型国企网站建设费用

5分钟掌握IPTV频道筛选:iptv-checker桌面版终极使用指南 【免费下载链接】iptv-checker IPTV source checker tool for Docker to check if your playlist is available 项目地址: https://gitcode.com/GitHub_Trending/ip/iptv-checker 你是否曾面对数千个I…

张小明 2026/1/10 22:48:38 网站建设