摘要: 阶段执行器,跟Barrier有点类似。 分阶段执行,一个阶段中所有的线程都执行完了再执行下一个阶段的线程。 下面的代码是模仿一对新人结婚的场景:1. 等所有人到齐了 2. 等所有人都吃完了 3.等所有人都离开了 4. 新人入洞房。这四个步骤分为四个阶段执行。 假设婚礼参加都人数算上新人一共有7个人, 阅读全文
posted @ 2020-09-23 22:44 Risus 阅读(346) 评论(0) 推荐(0) 编辑
摘要: 当线程树达到一定数量,这个栅栏放到,执行这些数量的线程,然后有拦住下一批线程。 第一个参数指的是拦住的线程数。它要等到放过去的那一批线程全部执行完才能执行下一批,相当于一个限流器,相当于我们现实中挤地铁一样。 阅读全文
posted @ 2020-09-23 22:14 Risus 阅读(117) 评论(0) 推荐(0) 编辑
摘要: ReentrantLock 是可以替代synchronized使用的。 区别与优点: ReentrantLock vs synchronized 底层是CAS vs sync锁升级 可以使用tryLock进行一个锁状态的判断和处理 可以使用lockInterrupptibly 打断当前锁的等待状态 阅读全文
posted @ 2020-09-23 21:41 Risus 阅读(108) 评论(0) 推荐(0) 编辑
摘要: cpu volatile 和上一篇java volatile 不一样。 cpu是如何保证各内存之间数据可见性的呢? 答:缓存一致性协议 (MESI cache)。 cache line:cpu缓存行,多大呢 64b字节 阅读全文
posted @ 2020-05-14 21:59 Risus 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 先解释下cpu指令重排序:cup的执行效率一般是内存的100倍左右,假设当cup先后接收到两条指令,指令1和指令2,指令1在执行指令到内存给cpu返回结果需要5秒,但是指令2的整个过程只需要2秒,那么cpu会优先执行指令2,再执行指令1,这就叫cpu指令重排序. 请看图解: 那么volatile: 阅读全文
posted @ 2020-05-14 20:37 Risus 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 可重入锁: 例子-- 阅读全文
posted @ 2020-05-13 21:42 Risus 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2020-05-13 21:36 Risus 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 死锁:线程之间因条件相互竞争,导致线程都不能正常执行完,从而产生了死锁。 死锁的例子: public class TestDeadLock implements Runnable { public int flag = 1; static Object o1 = new Object(), o2 = 阅读全文
posted @ 2020-05-11 22:40 Risus 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 如何保证多个线程多同一个资源的共享透明化: 一个有问题的多线程的例子:: public class TestSync implements Runnable{ Timer timer = new Timer(); public static void main(String[] args) { Te 阅读全文
posted @ 2020-05-11 22:34 Risus 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2020-05-10 23:23 Risus 阅读(106) 评论(0) 推荐(0) 编辑