仍在加速发展,也在加速走下神坛
线程池 在工作中常用,面试也是必考点。关于线程池的细节跟使用在以前举例过一个 银行排队 办业务的例子了。线程池一般主要也无非就是下面几个考点了:
8、ThreadLocal ThreadLocal 可以简单理解为线程本地变量,相比于 synchronized 是用空间来换时间的思想。他会在每个线程都创建一个副本,在线程之间通过访问内部副本变量的形式做到了线程之间互相隔离。这里用到了 弱引用 知识点: 如果一个对象只具有弱引用,那么GC回收器在扫描到该对象时,无论内存充足与否,都会回收该对象的内存。 8.1 核心点 每个Thread内部都维护一个ThreadLocalMap字典数据结构,字典的Key值是ThreadLocal,那么当某个ThreadLocal对象不再使用(没有其它地方再引用)时,每个已经关联了此ThreadLocal的线程怎么在其内部的ThreadLocalMap里做清除此资源呢?JDK中的ThreadLocalMap没有继承java.util.Map类,而是自己实现了一套专门用来定时清理无效资源的字典结构。其内部存储实体结构Entry
接着分析底层代码会发现在调用ThreadLocal.get() 或者 ThreadLocal.set() 都会 定期回收无效的Entry 操作。 有的同学可能会说如果我传入的不是全局变量的指针(引用)是不是就不会有问题了? 答案依然是it depends,要看情况。 即便我们传入的参数是在堆上(heap)用malloc或new出来的,依然可能会有问题,为什么?
答案很简单,因为堆上的资源也是所有线程可共享的。 这样的代码请放心大胆的在多线程中使用,不会有任何问题。 有的同学可能会说,那如果我们还是使用线程私有资源,但是传入函数参数呢? 线程私有资源+函数参数 这样的代码是线程安全的吗?自己先想一想这个问题。答案是it depends,也就是要看情况。看什么情况呢? 1,按值传参
如果你传入的参数的方式是按值传入,那么没有问题,代码依然是线程安全的: (编辑:惠州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |