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

本地上海集团网站建设做网站地图邮什么好处

本地上海集团网站建设,做网站地图邮什么好处,龙华网站设计公司,seo研究中心晴天ThreadLocal基础概念#xff1a;IT-BLOG-CN ThreadLocal是Java中用于在同一个线程中存储和隔离变量的一种机制。通常情况下#xff0c;我们使用ThreadLocal来存储线程独有的变量#xff0c;并在任务完成后通过remove方法清理这些变量#xff0c;以防止内存泄漏。然而…ThreadLocal基础概念IT-BLOG-CN ThreadLocal是Java中用于在同一个线程中存储和隔离变量的一种机制。通常情况下我们使用ThreadLocal来存储线程独有的变量并在任务完成后通过remove方法清理这些变量以防止内存泄漏。然而在使用线程池时线程会被重用这可能导致ThreadLocal变量未被及时清理从而引发内存泄漏问题。 除了直接调用ThreadLocal的remove方法外还有一些其他方式可以帮助释放ThreadLocal变量 一、在线程池中使用自定义的ThreadFactory 创建一个自定义的ThreadFactory在创建线程时添加钩子以便在任务完成后清理ThreadLocal变量。扩展搭建统一线程池平台对该部分进行了改造。提供多个工厂就包含自动清理工厂。 import java.util.concurrent.ThreadFactory;public class CleaningThreadFactory implements ThreadFactory {private final ThreadFactory defaultFactory Executors.defaultThreadFactory();Overridepublic Thread newThread(Runnable r) {return defaultFactory.newThread(() - {try {r.run();} finally {// 清理ThreadLocal变量ThreadLocalHolder.clear();}});} }这里的ThreadLocalHolder就是所有ThreadLocal的一个管理类这里举个例子 public class ThreadLocalHolder { private static final ThreadLocalAggAlibabaRerQueryResponse TL_AGG_REF_RER new ThreadLocal(); private static final ThreadLocalOpenAlibabaSearchResponse TL_ORDER_DETAIL new ThreadLocal();// get/set 只流一个参考 public static void setAggRefRer(AggAlibabaRerQueryResponse aggRefRer) { TL_AGG_REF_RER.set(aggRefRer); }public static FlightRefRerQueryResponse getFlightRefRer() {return TL_FLIGHT_REF_RER.get(); }/*** 用于清空threadlocal否则会有内存泄漏*/public static void clear() {TL_AGG_REF_RER.remove();TL_ORDER_DETAIL.remove(); }二、使用ThreadPoolExecutor的钩子方法 可以扩展ThreadPoolExecutor并覆盖其beforeExecute和afterExecute方法以便在任务执行前后进行清理操作。 import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.LinkedBlockingQueue;public class CleaningThreadPoolExecutor extends ThreadPoolExecutor {public CleaningThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, LinkedBlockingQueueRunnable workQueue) {super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);}Overrideprotected void beforeExecute(Thread t, Runnable r) {super.beforeExecute(t, r);// 清理之前的ThreadLocal变量ThreadLocalHolder.clear();}Overrideprotected void afterExecute(Runnable r, Throwable t) {super.afterExecute(r, t);// 清理当前的ThreadLocal变量ThreadLocalHolder.clear();} }三、使用装饰器模式包装Runnable和Callable 可以创建一个装饰器包装Runnable和Callable任务在任务执行前后进行清理操作。 import java.util.concurrent.Callable;public class CleaningRunnable implements Runnable {private final Runnable task;public CleaningRunnable(Runnable task) {this.task task;}Overridepublic void run() {try {task.run();} finally {// 清理ThreadLocal变量ThreadLocalHolder.clear();}} }public class CleaningCallableV implements CallableV {private final CallableV task;public CleaningCallable(CallableV task) {this.task task;}Overridepublic V call() throws Exception {try {return task.call();} finally {// 清理ThreadLocal变量ThreadLocalHolder.clear();}} }四、使用ThreadLocal的子类 可以创建一个ThreadLocal的子类并在任务完成后自动清理变量。可以通过覆盖initialValue方法来实现finalize 出发的时机是在gc的时候但是finalize方法在现代Java开发中并不推荐使用因为它的执行时间和执行顺序是不确定的。 public class AutoCleanupThreadLocalT extends ThreadLocalT {Overrideprotected void finalize() throws Throwable {this.remove();super.finalize();} }五、TheadLocal 实际使用案例 将整个流程中需要用到的接口数据都存储起来这个流程中调用链路比较深同时也存在并发的操作可以使用ThreadLocal public class ThreadLocalHolder { private static final ThreadLocalAggAlibabaRerQueryResponse TL_AGG_REF_RER new ThreadLocal(); private static final ThreadLocalOpenAlibabaSearchResponse TL_ORDER_DETAIL new ThreadLocal(); private static final ThreadLocalFlightAlibabaResponse TL_FLIGHT_REF_RER new ThreadLocal(); private static final ThreadLocalXOrderAlibabaInfo TL_X_ORDER_DETAIL new ThreadLocal(); private static final ThreadLocalFlightAlibabaResponseBodyType TL_DOM_FLIGHT_SEARCH_RESULT new ThreadLocal(); private static final ThreadLocalResponseAlibabaType TL_RESCHEDULE_FLIGHT_SEARCH_RESULT new ThreadLocal();// get/set 只流一个参考 public static void setAggRefRer(AggAlibabaRerQueryResponse aggRefRer) { TL_AGG_REF_RER.set(aggRefRer); }public static FlightRefRerQueryResponse getFlightRefRer() {return TL_FLIGHT_REF_RER.get(); }/*** 用于清空threadlocal否则会有内存泄漏*/public static void clear() {TL_AGG_REF_RER.remove();TL_ORDER_DETAIL.remove();TL_FLIGHT_REF_RER.remove();TL_X_ORDER_DETAIL.remove();TL_DOM_FLIGHT_SEARCH_RESULT.remove();TL_RESCHEDULE_FLIGHT_SEARCH_RESULT.remove(); }六、基础支持补充 ----- ThreadLocal 的实现原理 下面是ThreadLocal的类图结构从图中可知Thread类中有两个变量threadLocals和inheritableThreadLocals二者都是ThreadLocal内部类ThreadLocalMap类型的变量我们通过查看内部类ThreadLocalMap可以发现实际上它类似于一个HashMap。在默认情况下每个线程中的这两个变量都为null。 ThreadLocal.ThreadLocalMap threadLocals null; ThreadLocal.ThreadLocalMap inheritableThreadLocals null;只有当线程第一次调用ThreadLocal的set或者get方法的时候才会创建他们后面我们会查看这两个方法的源码。除此之外每个线程的本地变量不是存放在ThreadLocal实例中而是放在调用线程的ThreadLocals变量里面前面也说过该变量是Thread类的变量。也就是说ThreadLocal类型的本地变量是存放在具体的线程空间上相当于一个装载本地变量的工具壳通过set方法将value添加到调用线程的threadLocals中当调用线程调用get方法时候能够从它的threadLocals中取出变量。如果调用线程一直不终止那么这个本地变量将会一直存放在他的threadLocals中所以不使用本地变量的时候需要调用remove方法将threadLocals中删除不用的本地变量。下面我们通过查看ThreadLocal的set、get以及remove方法来查看ThreadLocal具体实怎样工作的。 【1】set方法源码 public void set(T value) {//(1)获取当前线程调用者线程Thread t Thread.currentThread();//(2)以当前线程作为key值去查找对应的线程变量找到对应的mapThreadLocalMap map getMap(t);//(3)如果map不为null就直接添加本地变量key为当前线程值为添加的本地变量值if (map ! null)map.set(this, value);//(4)如果map为null说明首次添加需要首先创建出对应的mapelsecreateMap(t, value); }在上面的代码中(2)处调用getMap方法获得当前线程对应的threadLocals(参照上面的图示和文字说明)该方法代码如下 ThreadLocalMap getMap(Thread t) {return t.threadLocals; //获取线程自己的变量threadLocals并绑定到当前调用线程的成员变量threadLocals上 }如果调用getMap方法返回值不为null就直接将value值设置到threadLocals中key为当前线程引用值为本地变量如果getMap方法返回null说明是第一次调用set方法前面说到过threadLocals默认值为null只有调用set方法的时候才会创建map这个时候就需要调用createMap方法创建 threadLocals该方法如下所示createMap方法不仅创建了threadLocals同时也将要添加的本地变量值添加到了threadLocals中。 void createMap(Thread t, T firstValue) {t.threadLocals new ThreadLocalMap(this, firstValue); }【2】get方法源码 在get方法的实现中首先获取当前调用者线程如果当前线程的threadLocals不为null就直接返回当前线程绑定的本地变量值否则执行setInitialValue方法初始化threadLocals变量。在setInitialValue方法中类似于set方法的实现都是判断当前线程的threadLocals变量是否为null是则添加本地变量这个时候由于是初始化所以添加的值为null否则创建threadLocals变量同样添加的值为null。 public T get() {//(1)获取当前线程Thread t Thread.currentThread();//(2)获取当前线程的threadLocals变量ThreadLocalMap map getMap(t);//(3)如果threadLocals变量不为null就可以在map中查找到本地变量的值if (map ! null) {ThreadLocalMap.Entry e map.getEntry(this);if (e ! null) {SuppressWarnings(unchecked)T result (T)e.value;return result;}}//(4)执行到此处threadLocals为null调用该更改初始化当前线程的threadLocals变量return setInitialValue(); }private T setInitialValue() {//protected T initialValue() {return null;}T value initialValue();//获取当前线程Thread t Thread.currentThread();//以当前线程作为key值去查找对应的线程变量找到对应的mapThreadLocalMap map getMap(t);//如果map不为null就直接添加本地变量key为当前线程值为添加的本地变量值if (map ! null)map.set(this, value);//如果map为null说明首次添加需要首先创建出对应的mapelsecreateMap(t, value);return value; }【3】remove方法的实现 remove方法判断当前线程对应的threadLocals变量是否为null不为null就直接删除当前线程中指定的threadLocals变量。 public void remove() {//获取当前线程绑定的threadLocalsThreadLocalMap m getMap(Thread.currentThread());//如果map不为null就移除当前线程中指定ThreadLocal实例的本地变量if (m ! null)m.remove(this); }private void remove(ThreadLocal? key) {Entry[] tab table;int len tab.length;int i key.threadLocalHashCode (len-1);for (Entry e tab[i];e ! null;e tab[i nextIndex(i, len)]) {if (e.refersTo(key)) {e.clear();expungeStaleEntry(i);return;}} }【4】如下图所示 每个线程内部有一个名为threadLocals的成员变量该变量的类型为ThreadLocal.ThreadLocalMap类型类似于一个HashMap其中的key为当前定义的ThreadLocal变量的this引用value为我们使用set方法设置的值。每个线程的本地变量存放在自己的本地内存变量threadLocals中如果当前线程一直不消亡那么这些本地变量就会一直存在可能会导致内存溢出因此使用完毕需要将其remove掉。
http://www.dnsts.com.cn/news/281790.html

相关文章:

  • 无限弹窗网站链接怎么做iis做网站文件下载
  • 工信部 网站备案规定网站开发的缺点
  • 用自己电脑配置服务器做网站做门户网站预算
  • 兼职做一篇微信的网站中国核工业第二二建设有限公司待遇
  • 学做网站能赚多少永嘉网站建设几
  • 如何用html做班级网站html5开发wap网站
  • 泸州网站开发公司seo在线优化系统
  • 专业建站公司设计方案搜索引擎优化的方法有哪些?
  • tp5 网站开发世界工厂网登录
  • 山东省城乡住房和建设厅网站黄骅港金沙滩景区
  • 做贸易的都有什么网站做画册好的网站
  • 南充网站建设公司优书网书库
  • 英文WordPress站点切换为中文免费网站教程
  • 做网站前两个月应该干什么吉首做网站
  • 哪个是网络营销导向网站建设的基础做鞋的垂直网站
  • 想做一个部门的网站怎么做2018做论坛网站好吗
  • 网站开发会议议程范文查看域名之前做的网站
  • 如何做网站规范珠海百度seo公司
  • 百度小程序跟做网站南阳建网站企业
  • 贵阳网站制作费用人人开发app
  • 注册建设通网站找人开发一个app多少钱
  • 稀奇古怪好玩有用的网站网站建设技术网站
  • html5网站建设中专做外贸库存的网站
  • 做网站用虚拟主机好吗网站之间如何做视频交换
  • 外贸推广的几种方式以及效果排行广东宣布即时优化调整
  • 网站建设江苏百拓网站建设太难了
  • 描述网站开发的过程哪里可以学网站建设
  • 会员收费网站怎么做个人建站赚钱
  • 网站优化推广多少钱哪个app可以找培训班
  • 西安网站建设 至诚律师网站建设 优帮云