
JUC
文章平均质量分 69
Zzz_hl
个人网站:https://zhouhuilong.cn/
展开
-
CompletableFuture 的统一异常处理及超时处理
项目中需要调用多个服务,如果使用 open-Feign 串行化调用,响应时间可能会比较长,后续使用了 CompletableFuture 和线程池进行异步调用,但是在调用时,可能存在调用的服务报错,导致整个查询方法直接抛出异常,无法继续后面的操作,抽象了工具类 AsyncUtil 集中处理调用信息和异常信息,可以看到即使调用服务发生了异常,也能继续执行,发生异常后记录了报错信息且返回给前端状态信息。现在我想捕获调用时的异常,且不影响后续的执行。正常情况下执行也没有问题。原创 2025-03-17 21:11:38 · 253 阅读 · 0 评论 -
为什么不在 ForkJoinPool 中使用虚拟线程?
为什么不在ForkJoinPool中使用虚拟线程?原创 2025-01-20 11:18:37 · 372 阅读 · 0 评论 -
ReentrantLock底层原理
ReentrantLock的底层实现原理原创 2024-06-10 21:49:07 · 573 阅读 · 0 评论 -
AQS实现原理
AQS的实现原理原创 2024-06-10 21:48:17 · 399 阅读 · 0 评论 -
JUC并发编程——对CAS的理解和分析
CAS(CompareAndSet 或 CompareAndSwap)又称 无锁,乐观锁,实现方式是非阻塞同步。CAS指令有三个操作数,分别是内存位置(在Java中可以简单地理解为变量的内存地址,用V表示)、旧的预期值(用A表示)和准备设置的新值(用B表示)。CAS指令执行时,当且仅当V符合A时,处理器才会用B更新V的值,否则它就不执行更新。但是,不管是否更新了V的值,都会返回V的旧值,上述的处理过程是一个操作,执行期间不会被其他线程中断。CAS指令的底层是原子操作,保证了原子性,解决了指令交错问题。原创 2024-04-02 16:53:03 · 370 阅读 · 0 评论 -
JUC并发编程—— 对volatile的理解及DCL的解决方法
volatile 的底层实现原理是加入 volatile 关键字后,写指令(被 volatile 修饰的变量在对此变量修改时)会加入写屏障,读指令(被 volatile 修饰的变量在对此变量读取时)会加入读屏障。原创 2024-04-01 19:55:35 · 338 阅读 · 0 评论 -
JUC并发编程——wait / notify原理
Monitor 中有三个部分:Owner,EntrySet 和 WaitSet。Owner 是拥有锁的线程地址,EntrySet 是其他线程想要获取锁的列表,WaitSet 是拥有锁的线程一些条件未满足调用 wait() 方法,进入的WaitSet列表,并且释放锁。在 EntryList 中的线程状态是 BLOCKED,在 WaitSet 中的线程状态是 WAITING。都不占用 CPU 时间片。原创 2024-03-31 20:42:33 · 525 阅读 · 0 评论 -
JUC并发编程——对于synchronized关键字的理解
两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,最后输出的counter一定为0 吗?原创 2024-03-30 14:33:36 · 1010 阅读 · 0 评论 -
JUC并发编程——常用方法
异常,但是查询t1的打断状态缺失,显示未打断,说明 sleep 时线程被 interrupt 后,清除了 interrupt 的状态。打断 sleep,wait,join 的线程,这几个方法都会让线程进入阻塞状态。注意 interrupt() 和 isInterrupted() 方法的区别。可以看到t1 sleep 一秒后已经被打断了,且抛出了。打断 sleep 的线程, 会清空打断状态。:等待线程运行结束,最多等待 n 毫秒。打断正常运行的线程,不会清除打断状态。未调用 join 方法。原创 2024-03-28 18:54:13 · 346 阅读 · 0 评论