logo头像

BUG本天成,妙手偶得之

探索JAVA并发 - 终于搞懂了sleep/wait/notify/notifyAll

sleep/wait/notify/notifyAll分别有什么作用?它们的区别是什么?wait时为什么要放在循环里而不能直接用if? 简介首先对几个相关的方法做个简单解释,Object中有几个用于线程同步的方法:wait、not...

探索JAVA并发 - 如何减少锁的竞争

锁的竞争会限制代码的可伸缩性,在并发编程时通过一些手段有意地减少锁竞争,可以让程序有更好的表现。 所谓可伸缩性,即当增加计算资源(如CPU、内存、带宽等)时,程序的吞吐量或处理能力会相应增加。这个时候,我们当然希望增加的效果越明显...

探索JAVA并发 - 线程池详解

线程池是并发编程中必不可少的一种工具,也是面试高频话题。 线程池,即管理着若干线程的资源池(字面意思)。相比于为每个任务分配一个线程,在线程池中执行任务优势更多: 线程复用:线程池中的线程是可以复用的,省去了创建、销毁线程的开销...

探索JAVA并发 - 如何处理线程中断

中断是一种协作机制,通过这种机制可以要求指定线程在可以暂停的地方停止当前任务,但这个要求可以无视,我们也经常这么做(虽然不好),那应该这么对待其它线程发来的中断要求呢? 在上一篇如何优雅地取消线程任务中提到了通过中断可以取消线程正...

探索JAVA并发 - 如何优雅地取消线程任务

通过线程启动一个异步的任务很容易,但想让它提前安全且快速地结束确并不简单。如果线程外部的代码可以提前把目标线程置为“完成”状态,那么这个目标线程就是可取消的。 线程任务取消的原因一般有如下几种: 用户请求取消: 比如用户发起一个...

探索JAVA并发 - 同步工具类

同步工具类是个笼统的概念,它可以根据自身状态来协调线程的控制流,了解JAVA中常用的同步工具能帮助开发者写出更好的并发代码。 闭锁 CountDownLatch闭锁的作用相当于一扇门,在这扇门没打开前,任何线程执行到这里都会被无情...

探索JAVA并发 - ThreadLocal

使用ThreadLocal可以维持线程封闭性,使线程中的某个值与保存值的对象关联,防止对可变的单例变量或全局变量进行共享,但使用不当也会造成内存泄漏,先了解它,再使用它​。​ 从SimpleDateFormat说起SimpleDa...

探索JAVA并发 - synchronized和ReentrantLock如何选择

synchronized、ReentrantLock,我该为谁转身? 两者的区别: synchronized:内置锁,即JVM的内置属性,在虚拟机层面实现了对锁的支持 ReentrantLock:Lock接口的一种实现,即通过代...