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

房屋出租网站模板深圳设计公司上市成功有几家

房屋出租网站模板,深圳设计公司上市成功有几家,商务网站建设的流程,wordpress 修改链接失效问题的提出 在Java多线程中#xff0c;共享变量的读写非常容易出现不可预测的行为#xff0c;因此对共享变量的访问控制非常重要。因此在多线程编程时#xff0c;为了保证线程安全#xff0c;需要进行额外的同步措施。比如典型的操作就是加锁。除了加锁外#xff0c;另一…问题的提出 在Java多线程中共享变量的读写非常容易出现不可预测的行为因此对共享变量的访问控制非常重要。因此在多线程编程时为了保证线程安全需要进行额外的同步措施。比如典型的操作就是加锁。除了加锁外另一种常用的方法是使用ThreadLocal , 这种用法在框架中非常普遍。ThreadLocal可以理解为线程本地变量。多个线程对同一个变量如何不互相影响那么只有对自身独有的变量访问独占内存时才是线程安全的因此ThreadLocal 为变量在每个线程中都创建了一个副本该副本只能被当前线程访问多线程之间是隔离的变量不能在多线程之间共享。这样每个线程修改变量副本时不会对其他线程产生影响。 常规做法 多线程访问 ThreadLocal 变量时都会有自己独立的实例副本要维护线程与变量的对应关系一种普遍的思维就是在 ThreadLocal 中维护一个映射表 Map 用于记录线程与实例之间的映射关系也就是有一层总控的协调在里面。但是如果存在总控进行协调那么在新增线程和销毁线程时都需要更新 Map 中的映射关系时就会在总控这里产生多线程并发修改那么就又产生了额外的操作来保证 Map 是线程安全的。如果是在高并发的场景并发修改 Map 需要加锁会明显降低性能。 JDK的实现 JDK的 ThreadLocal 提供了一种新的思路从 Thread 的视角来看在 Thread 中维护一个 Map用于记录 ThreadLocal 与实例之间的映射关系这样在同一个线程内Map 就不需要加锁了。 从 Thread 代码定义看出Thread类依赖了ThreadLocal.ThreadLocalMap public class Thread implements Runnable {/* ThreadLocal values pertaining to this thread. This map is maintained* by the ThreadLocal class. */ThreadLocal.ThreadLocalMap threadLocals null; } 从 ThreadLocal 的代码来看 它的get/set都是从线程取到对应的ThreadLocal.ThreadLocalMap代码仅以get示例。它定义的ThreadLocalMap的 Entry 继承了WeakReferenceEntry的key是弱引用value是强引用。这样设计获得了另外一个好处防止内存泄漏。在 JVM 垃圾回收时只要发现了弱引用的对象不管内存是否充足都会被回收。如果key是强引用当ThreadLocal不再使用时ThreadLocalMap中还是存在对ThreadLocal的强引用那么GC是无法回收的从而造成内存泄漏。 public class ThreadLocalT {/*** Returns the value in the current threads copy of this* thread-local variable. If the variable has no value for the* current thread, it is first initialized to the value returned* by an invocation of the {link #initialValue} method.** return the current threads value of this thread-local*/public T get() {Thread t Thread.currentThread();ThreadLocalMap map getMap(t);if (map ! null) {ThreadLocalMap.Entry e map.getEntry(this);if (e ! null) {SuppressWarnings(unchecked)T result (T)e.value;return result;}}return setInitialValue();}ThreadLocalMap getMap(Thread t) {return t.threadLocals;}static class ThreadLocalMap {/*** The entries in this hash map extend WeakReference, using* its main ref field as the key (which is always a* ThreadLocal object). Note that null keys (i.e. entry.get()* null) mean that the key is no longer referenced, so the* entry can be expunged from table. Such entries are referred to* as stale entries in the code that follows.*/static class Entry extends WeakReferenceThreadLocal? {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal? k, Object v) {super(k);value v;}}} }Entry的key设计成了弱引用但是当ThreadLocal不再使用被 GC 回收后ThreadLocalMap 中可能出现 Entry的key为null那么Entry的value一直会强引用数据而得不到释放只能等待线程销毁。如何避免ThreadLocalMap内存泄漏? ThreadLocal做了如下的保护措施在执行 ThreadLocal.set()/get()方法时ThreadLocal会调用expungeStaleEntry方法清除 ThreadLocalMap 中key为null的 Entry 对象让它还能够被 GC 回收。 expungeStaleEntry方法会遍历ThreadLocalMap的散列表从当前节点开始向后遍历数组将过期的条目即key为null的条目清理掉并将这些条目的位置设置为null。如果遇到未过期的数据则重新计算其位置并重新分配确保数据尽可能靠近正确的位置以减少冲突和查找时间‌。 编程习惯 在编程时还需要注意 当线程中某个ThreadLocal对象不再使用时立即调用remove()方法删除Entry对象。如果是在异常的场景中应在finally代码块中进行清理保持良好的异常处理意识。 学得经验 除了集中控制并发外可以将竞争的数据分散出去。解决方案的自洽性增加了线程自身的数据副本需要保证生命周期的一致性这里的设计尽最大可能的保证了GC的可执行。
http://www.dnsts.com.cn/news/41917.html

相关文章:

  • 兼职做网站有没有专门做花鸟鱼虫的网站
  • 承接网站建设广告语wordpress怎样添加左侧菜单的功能
  • 网站的建设心得本周热点事件
  • 建网站的公司哪个好her123 wordpress
  • 北京手机网站开发价格有代做医学统计图的网站吗
  • 网站制作工作流程企业计划书怎么写
  • 做公司网站解析搜索引擎优化通常要注意的问题有( )
  • 沧州企业网站专业定制wordpress文章列表主题
  • 医疗行业企业网站建设设计网址有哪些
  • 网站seo站外优化wordpress site
  • 网站上线的步骤公司oa办公平台
  • 徐州网站平台制作公司河北建设工程招标网
  • 物流网站建设与管理wordpress删除边栏
  • 泉州做网站seo宣传推广策略有哪些
  • 正规的企业网站建设公司备案怎么关闭网站吗
  • 企业年底做网站的好处网站百度关键词优化
  • 用记事本做网站专业智能建站网站
  • 辽宁省城乡和住房建设厅网站搜狗网址大全
  • 银川专业做网站的公司wordpress企业 破解主题下载地址
  • 做网站的结论和心得软件外包平台 接单
  • 沧州网站建设建站系统学前端好还是后端好
  • 微信公众号建立网站2024年营业执照年审入口
  • 建筑论坛网站东莞市网络策划推广哪家好
  • 网站开发和软件开发含义网络营销推广专员的岗位职责
  • 做优惠卷网站倒闭了多少中建装饰集团
  • 网站聚合页面营销网站建设 公司排名
  • 新八建设集团网站杭州前十强装修公司有哪几家
  • 有口碑的郑州网站建设安卓app用什么开发
  • 网站可以自己维护吗望野王维原文
  • 如何抄袭网站电子商务网站建设 试卷