交替输出事例@Slf4jpublic class Demo02 {public static void main(String[] args) {Await await = new Await(5);Condition a = await.newCondition();Condition b = await.newCondition();Condition c = await.newCondition();new Thread(()->{await.print("a",a,b);},"t1").start();new Thread(()->{await.print("b",b,c);},"t2").start();new Thread(()->{await.print("c",c,a);},"t3").start();await.lock();a.signal();await.unlock();}}@Slf4jclass Await extends ReentrantLock{private int num;public Await(int num) {this.num = num;}public void print(String str, Condition condition, Condition next){for (int i = 0; i < num; i++) {lock();try {condition.await();log.info("打印{}",str);next.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {unlock();}}}}可见性停不下来的循环static boolean run = true;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {while (run) {}});t.start();sleep(1);run = false; // 线程t不会如预想的停下来}

文章插图
解决方案
volatile(易变关键字)它可以用来修饰成员变量和静态成员变量 , 他可以避免线程从自己的工作缓存中查找变量的值 , 必须到主存中获取它的值 , 线程操作 volatile 变量都是直接操作主存
也可以使用synchronize进行加锁解决 。
volatile可以改进之前的两阶段终止模式 。进行打断标记的判断 。
private volatile boolean stop = false;有序性JVM 会在不影响正确性的前提下 , 可以调整语句的执行顺序 , 思考下面一段代码

文章插图
cpu指令重排可以提高运行效率 , 将不同的指令交给不通的处理器
原理略【并发编程笔记 阿里 并发编程笔记2】以后需要的时候再看这些八股文
先暂时不看了
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
