摘要:需求 看到有人说:Threadlocal的错误使用,会导致内存溢出,所以来分析一下源码。 结论 简而言之,就是通过 ThreadLocal 添加的 value 与 Thread 是强引用关系,在 Thread 无法正常销毁的场景下,有内存泄漏的隐患,例如:线程池。 解决方案:代码执行完成之后,要注意
阅读全文
摘要:问题 在学习 spring 的时候,我思考过这么个问题: spring 容器中,每个对象都是独一份的,服务器并发量那么大,就一个对象,够用么?会不会竞争啥的啊? 换一种问法:假设有一个函数,需要 10 分钟才能跑完,两个线程都去调用它,第二个线程要不要等 10 分钟? 解释 其实没任何经验的,就能回
阅读全文
摘要:抽象锁 AbstractQueuedSynchronizer 很难去翻译这个词,抽象排队同步器?这里姑且叫抽象锁吧。 抽象锁只是一个抽象类,锁封装了一些锁的常规操作,包括信号量、倒数锁、可重入锁,内部代码都包含了抽象同步锁的实现类。 抽象同步锁用到了Unsafe类,Unsafe虽然在Java的基础包
阅读全文
摘要:可重入锁 其实 synchronized 就是一个可重入锁,而 ReentrantLock 具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但 ReentrantLock 的功能更强大。 可重入锁“可重入”的意思就是:当前线程获取了一个锁,就可以进入任何
阅读全文
摘要:CyclicBarrier 直译是:循环屏障、可重用屏障。日常交流过程中,也可能称作:线程屏障。 跟信号量、倒数锁一样,都可以简单地实现“多个子线程执行完毕,主线程开始执行”的功能。 而屏障锁是其中较为特殊的: 几个线程互相等待,直到某个公共屏障点 (common barrier point),它们
阅读全文
摘要:CountDownLatch 倒数锁,顾名思义,需要给定一个初始值,每次调用计数减一,计数到达零之前,线程将一直受阻塞,计数到零之后,会释放所有等待的线程。 业务场景:主线程需要5个并发的初始化操作,5个线程全部执行完毕,主线程开始执行。 /** * @author ChenSS on 2018年2
阅读全文
摘要:Semaphore 直译:发出信号、打旗语,在编程中通常被称为:计数信号量,或者信号量。 举个生活案例 比如说旅店有10个单人间,有非常多的人要住; 最多只会只有10个人拿到钥匙; 没拿到钥匙的人非要住,那就只能等了; 而拿走钥匙的人,不住了那就必须退还钥匙,不然别人就没办法住。 信号量的使用类似于
阅读全文
摘要:说原理之前,先看下面这一段代码,这是我根据原理简化出来的代码。 每一个 Thread 内部,都包含着一个 ThreadLocalMap; ThreadLocal 是帮助我们去 ThreadLocalMap 中取值的工具; ThreadLocal 存取值的时候,先找到 Thread.currentTh
阅读全文
摘要:经典面试题 数据容器:封装生产、消费所需的数据。 生产者:从容器中填装东西,东西生产好了,及时通知消费者。 消费者:从容器取数据,东西取完了,及时通知生存者生产。 分析 没有任何实战价值,但是面试的时候会问。 本文主要是想介绍 Thread 相关的函数,一般不会用到这么底层的代码。 推荐方案:使用读
阅读全文
摘要:概念 内存泄漏,首先要了解什么是引用, 以下列代码为例,新建对象 B,B 中有个成员变量 a,小 a 上 new 了一个 A 实例,B 就有 A 实例的引用, 这时候,只要 B 存在,A 实例就不会被销毁, 什么时候 A 实例会被销毁呢?给 B 对象 set 一个新的实例,或者设置为 null,旧的
阅读全文
摘要:**spring 框架下有封装好的线程池,尽量优先选择 spring 提供的。** 不推荐新手学习,因为学习门槛非常高,需要有一定的封装经验,否则会很难理解它的设计; 而且实战的机会非常少,学完可能几年内都用不上。 不必担心面试提问,因为很少会直接使用,面试你的人大概率也是没用过的,用过也只能说明他
阅读全文