为了方便动态调整线程池参数,将线程池参数的配置放到配置中心中,比如 Nacos,Apollo。 在七个线程池参数中,corePoolSize(核心线程数),maximumPoolSize(最大线程数),workQueue(阻塞队列),handler...
JUC
CompletableFuture 的统一异常处理及超时处理
背景 项目中需要调用多个服务,如果使用 open-Feign 串行化调用,响应时间可能会比较长,后续使用了 CompletableFuture 和线程池进行异步调用,但是在调用时,可能存在调用的服务报错,导致整个查询方法直接抛出...
为什么不在 ForkJoinPool 中使用虚拟线程?
刚才看到一张帖子提到为什么在 ForkJoinPool 中不使用虚拟线程? 在 JDK 21 中进行测试 public static void main(String[] args) throws InterruptedException { Runnable task = () -> { System....
ReentrantLock底层原理
ReentrantLock public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } ReentrantLock 的默认实现是非公...
AQS实现原理
AQS(AbstractQueuedSynchronizer)是一个用于构建锁和同步器的框架,许多同步器都可以通过AQS很容易并且高效地构造出来。 不仅 ReentrantLock 和 Semaphore 是基于AQS构建的,还包括 CountDownLatch、Reentrant...
对CAS的理解和分析
CAS CAS(CompareAndSet 或 CompareAndSwap)又称 无锁,乐观锁,实现方式是非阻塞同步。 CAS指令有三个操作数,分别是内存位置(在Java中可以简单地理解为变量的内存地址,用V表示)、旧的预期值(用A表示)和...
对volatile的理解及DCL的解决方法
volatile的原理 volatile 的底层实现原理是内存屏障,Memory Barrier(Memory Fence) 加入 volatile 关键字后,写指令(被 volatile 修饰的变量在对此变量修改时)会加入写屏障,读指令(被 volatile 修饰的变量...
wait / notify原理
Monitor 中有三个部分:Owner,EntrySet 和 WaitSet。 Owner 是拥有锁的线程地址,EntrySet 是其他线程想要获取锁的列表,WaitSet 是拥有锁的线程一些条件未满足调用 wait() 方法,进入的WaitSet列表,并且释放...
对于synchronized关键字的理解
现象: 两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,最后输出的 counter一定为0 吗? @Slf4j(topic = "c.Test17") public class Test17 { static int counter = 0; ...
JUC并发编程中常用方法
sleep() public void testSleepAndYield() { Thread t1 = new Thread(() -> { try { log.debug("t1-sleep..."); Thread.sleep(2000); } catch (Interr...