加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 业界 > 正文

仍在加速发展,也在加速走下神坛

发布时间:2021-02-01 10:15:15 所属栏目:业界 来源:互联网
导读:线程池 在工作中常用,面试也是必考点。关于线程池的细节跟使用在以前举例过一个 银行排队 办业务的例子了。线程池一般主要也无非就是下面几个考点了: 为什么用线程池。 线程池的作用。 7大重要参数。 4大拒绝策略。 常见线程池任务队列,如何理解有界跟无

线程池 在工作中常用,面试也是必考点。关于线程池的细节跟使用在以前举例过一个 银行排队 办业务的例子了。线程池一般主要也无非就是下面几个考点了:

  • 为什么用线程池。
  • 线程池的作用。
  • 7大重要参数。
  • 4大拒绝策略。
  • 常见线程池任务队列,如何理解有界跟无界。
  • 常用的线程池模版。
  • 如何分配线程池个数,IO密集型 还是 CPU密集型。
  • 设定一个线程池优先级队列,Runable 类要实现可对比功能,任务队列使用优先级队列。

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,按值传参

如果你传入的参数的方式是按值传入,那么没有问题,代码依然是线程安全的:

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读