logo头像

BUG本天成,妙手偶得之

分布式场景下的定时任务实践

背景应用中常会需要一些定时执行的任务,在spring中通过@Scheduled注解可以轻松实现。 然鹅现在正儿八经的项目一般不会只部署一个实例,至少也得搞两台支持不中断服务的发布,壕一点的部署个十几台、几十台的问题不大。 这样一来我们...

探索JAVA并发 - 并发容器全家福

14个并发容器,你用过几个? 不考虑多线程并发的情况下,容器类一般使用ArrayList、HashMap等线程不安全的类,效率更高。在并发场景下,常会用到ConcurrentHashMap、ArrayBlockingQueue等线...

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

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

探索JAVA并发 - 悲观锁和乐观锁

什么是悲观锁,什么是乐观锁,它们是如何实现的? 定义 悲观锁:对世界充满不信任,认为一定会发生冲突,因此在使用资源前先将其锁住,具有强烈的独占和排他特性。 乐观锁:相信世界是和谐的,认为接下来的操作不会和别人发生冲突,因此不会上锁...

探索JAVA并发 - 可重入锁和不可重入锁

什么是可重入锁,什么是不可重入锁,它们是如何实现的? 定义 可重入锁:当线程获取某个锁后,还可以继续获取它,可以递归调用,而不会发生死锁; 不可重入锁:与可重入相反,获取锁后不能重复获取,否则会死锁(自己锁自己)。 不可重入锁用...

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

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

探索JAVA并发 - 线程池详解

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

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

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

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

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

探索JAVA并发 - 同步工具类

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