Java面试之多线程&并发篇(8)

打印 上一主题 下一主题

主题 1491|帖子 1491|积分 4473

前言

原来想着给本身放松一下,刷刷博客,突然被几道面试题难倒!引用范例有哪些?有什么区别?说说ThreadLocal原理?线程池原理知道吗?以及核心参数?线程池的拒绝策略有哪些?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘
*** 12万字的java面试题整理 ***
*** java核心面试知识整理 ***
*** Java高频面试解说视频(知识涵盖齐全) ***
引用范例有哪些?有什么区别?

引用范例主要分为强软弱虚四种:

  • 强引用指的就是代码中广泛存在的赋值方式,好比A a = new A()这种。强引用关联的对象,永远不会被GC接纳。
  • 软引用可以用SoftReference来描述,指的是那些有效但是不是必须要的对象。体系在发生内存溢出前会对这类引用的对象进行接纳。
  • 弱引用可以用WeakReference来描述,他的强度比软引用更低一点,弱引用的对象下一次GC的时候一定会被接纳,而不管内存是否充足。
  • 虚引用也被称作幻影引用,是最弱的引用关系,可以用PhantomReference来描述,他必须和ReferenceQueue一起使用,同样的当发生GC的时候,虚引用也会被接纳。可以用虚引用来管理堆外内存。
说说ThreadLocal原理?

threadLocal可以明白为线程本地变量,他会在每个线程都创建一个副本,那么在线程之间访问内部副本变量就行了,做到了线程之间互相隔离,相比于synchronized的做法是用空间来换时间。
ThreadLocal有一个静态内部类ThreadLocalMap,ThreadLocalMap又包罗了一个Entry数组,Entry本身是一个弱引用,他的key是指向ThreadLocal的弱引用,Entry具备了生存key value键值对的能力。
弱引用的目的是为了防止内存泄露,假如是强引用那么ThreadLocal对象除非线程结束否则始终无法被接纳,弱引用则会在下一次GC的时候被接纳。
但是如许还是会存在内存泄露的问题,假如key和ThreadLocal对象被接纳之后,entry中就存在key为null,但是value有值的entry对象,但是永远没办法被访问到,同样除非线程结束运行。
但是只要ThreadLocal使用适当,在使用完之后调用remove方法删除Entry对象,现实上是不会出现这个问题的。

线程池原理知道吗?以及核心参数

起首线程池有几个核心的参数概念:

  • 最大线程数maximumPoolSize
  • 核心线程数corePoolSize
  • 生动时间keepAliveTime
  • 壅闭队列workQueue
  • 拒绝策略RejectedExecutionHandler
当提交一个新任务到线程池时,具体的执行流程如下:

  • 当我们提交任务,线程池会根据corePoolSize大小创建若干任务数量线程执行任务
  • 当任务的数量凌驾corePoolSize数量,后续的任务将会进入壅闭队列壅闭列队
  • 当壅闭队列也满了之后,那么将会继续创建(maximumPoolSize-corePoolSize)个数量的线程来执行任务,假如任务处置惩罚完成,maximumPoolSize-corePoolSize额外创建的线程等候keepAliveTime之后被主动销毁
  • 假如达到maximumPoolSize,壅闭队列还是满的状态,那么将根据差别的拒绝策略对应处置惩罚

线程池的拒绝策略有哪些?

主要有4种拒绝策略:

  • AbortPolicy:直接丢弃任务,抛出异常,这是默认策略
  • CallerRunsPolicy:只用调用者所在的线程来处置惩罚任务
  • DiscardOldestPolicy:丢弃等候队列中最旧的任务,并执行当前任务
  • DiscardPolicy:直接丢弃任务,也不抛出异常

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表