多线程
文章平均质量分 65
keepfocus!
多听多看多思考
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
volatile与缓存一致性
最近在深入分析volatile关键字的实现原理,内存屏障、缓存一致性、store buffer、invalid queue等知识看了不少,但接触的资料比较零散,无法完整的把相关内容串联起来,所以抽空做些整理,也算对这段时间的学习做一个小结。 众所周知,volatile最主要的特性是保证了变量的可见性,即任意线程总能读到对volatile变量的最后写入(最新值)。而可见性正是依靠缓存一致性、内存屏障等机制协同运作来保证的。下面先就volatile与缓存一致性协议之间的关系分享下一点个人理解。 缓存一致性 计算原创 2021-01-27 15:25:39 · 1679 阅读 · 1 评论 -
volatile与内存屏障
volatile的作用 1.保证变量的可见性 2.局部限制指令重排(指令重排存在多种情况:1.编译器重排;2.处理器并行重排;3.因为store buffer,invalid queue等异步机制的存在导致的内存重排) 为了达到这两个目的,volatile做了两件事情: 1.禁止编译器的优化和重排 2.通过内存屏障限制处理器重排 首先明确下排序规则,简单总结如下(参考JSR-133) a.第二个操作为volatile写,则无论第一个操作是什么,都无法重排序; b.第一个操作为volatile读,则无论第二个原创 2021-01-27 15:21:52 · 588 阅读 · 1 评论 -
jdk线程池学习笔记
ThreadPoolExecutor: 1.线程池的线程存储在HashSet中,处理流程:core pool->blocking queue->max pool->reject policy; 2.核心线程池一般不会回收,除非设置了allowCoreThreadTimeOut,线程空闲时处于驻留状态(LockSupport.park); 3.keepAliveTime对于超过核心线程数部分的线程有效,超过空闲时间会回收。 Runnable vs. Callable: runnable无返回原创 2021-02-20 16:05:13 · 346 阅读 · 3 评论 -
浅析同步队列器AbstractQueuedSynchronizer和ReentrantLock
AbstractQueuedSynchronizer 队列同步器AbstractQueuedSynchronizer是整个JUC锁框架的基石,通过同步状态量state、CAS、ConditionObject等组件和一系列操作实现线程间的状态同步,也是CountDownLatch、Semaphore等并发工具的实现基础。 队列同步器包含下列核心组件: 1.同步变量state,volatile修饰,CAS操作更新,两者保证状态一致性; 2.内部类Node,代表竞争同步资源的线程节点,包含指向前后节点的引用,当存原创 2021-02-08 16:14:36 · 253 阅读 · 0 评论 -
java 线程状态和常用方法
on object moniter 意味着当前线程未持有锁 Thread.sleep() vs. LockSupport.park() a.两者都释放cpu执行权,但未释放锁; b.两者均可响应中断(t.interrupt()),但Thread.sleep()需要捕获中断异常,并且重置中断状态,LockSupport.park()直接向下执行,并且不会重置中断状态; c.LockSupport.park()可以通过ockSupport.unpark(t)唤醒,Thread.sleep() 只能等待睡眠时..原创 2021-01-28 23:08:33 · 148 阅读 · 0 评论
分享