![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 93
Dexu7
这个作者很懒,什么都没留下…
展开
-
【Java 并发编程】(大结局) 线程池常见八股与源码解读
本文略硬核, 但线程池作为后端服务器的基石, 不论是应付八股, 还是在真正工作中, 都是重中之重, 所以啃下这块硬骨头的收益还是很高的;废话不多说, 进入正题!原创 2024-08-17 09:48:16 · 1190 阅读 · 0 评论 -
【Java 并发编程】(五) ReentrantLock 源码解读
AQS,全称为 AbstractQueuedSynchronizer,是 Java 中 java.util.concurrent 包的一部分。作为构建锁或其他同步工具(如信号量、倒计时闸门等)的基础框架;原创 2024-08-17 09:47:38 · 946 阅读 · 0 评论 -
【Java 并发编程】(三) 从CPU缓存开始聊 volatile 底层原理
前面讲过, 当一个 CPU 要读某个数据时, 会向其它 CPU 查询是否有该数据的缓存, 如果有, 拿过来, 如果没有, 去内存拿;CPU1 读变量a, 发现 CPU0 有变量a的缓存, 那么拿到自己的缓存里来, 并将缓存的最新值写入内存, 缓存的状态变为S, CPU0和1现在都有a的缓存, 且状态都是 S;所以, 新生代上 new 对象, 一般适用指针碰撞;由于指令重排, 有可能还没调用构造方法, 就放到局部变量表里了, 这时候去使用它, 用的是一个没有经过构造方法初始化的对象, 很危险;原创 2024-08-16 09:45:34 · 1047 阅读 · 0 评论 -
【Java 并发编程】(二) 从对象内存布局开始聊 synchronized
当一个线程第一次进入同步块时,会尝试获取对象的偏向锁, 本质就是通过 CAS(下文会有详细介绍) 的方式, 将指向本线程的指针, 写到对象头里;一个线程持有监视器锁时, 其它线程尝试获取锁时将被阻塞, 放到该锁的阻塞队列中;持有锁的线程释放锁后, 如果有其他线程正在等待获取同一个对象的监视器锁,那么其中的一个线程会被唤醒;它的基本思想是,要修改某个值时, 先读取当前值, 记为e, 计算出要修改为的值v, 写回之前再次读取当前值n, 如果n和e不相同, 说明修改失败, 放弃修改, 重新执行此过程。原创 2024-08-15 20:55:15 · 1396 阅读 · 0 评论 -
【Java 并发编程】(一) 线程状态, 线程创建, 线程销毁
- 操作系统的内核级线程, 是CPU资源调度的最小单位; - 以最简单的时间片轮转调度算法为例, 在定时中断的中断处理函数中, 操作系统的调度程序选出一个就绪线程, 让其上 CPU 运行; - 另外还有用户级线程, 由用户应用程序内部自己进行切换, 该过程对操作系统来说并不可见, 在操作系统眼里它就是在执行线程 A, 至于应用在线程内自己分离出来并自己负责切换的线程 A-a 和 线程 A-b, 操作系统是不知道的;原创 2024-08-15 20:41:12 · 781 阅读 · 0 评论 -
后端面试被问: 说说你对ThreadLocal的理解 [附源码解读]
每个Thread对象, 内部有一个ThreadLocalMap threadLocals, 这是一个哈希表, 底层是一个Node[ ] table;当在某个线程中调用ThreadLocal的set方法时, 会使用Thread.currentThread获取当前先线程的thread对象, 然后将ThreadLocal对象作为key, 将set方法的参数作为value, 构建一个Entry, 将此Entry保存到thead对象的ThreadLocalMap中;原创 2024-07-27 20:38:26 · 635 阅读 · 0 评论