读书笔记《JAVA并发编程的艺术》 第三章 Java内存模型 3.3 顺序一致性

3.3 顺序一致性

3.3.1 数据竞争与顺序一致性

JMM对正确同步的多线程程序的内存一致性做了如下的保证:
如果程序是正确同步的,程序的执行将具有顺序一致性(Sequentially Consistent)—— 即程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。

3.3.2 顺序一致性内存模型

  1. 一个线程中的所有操作必须按照程序的顺序来执行
  2. (不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。

这里写图片描述
假设两个线程A和B并发执行,各自有3个操作,A线程的3个操作在程序中的顺序是:A1 -> A2 -> A3,B线程为:B1 -> B2 -> B3。
第一种情况:假设两个线程使用监视器锁来正确同步:
这里写图片描述
第二种情况:假设两个线程没有进行同步:
这里写图片描述

3.3.3 同步程序的顺序一致性效果

class SynchronizedExample(){
    int a = 0;
    boolean flag = false;
    public synchronized void writer(){  //获取锁
        a = 1;
        flag = true;
    }                                   //释放锁

    public synchronized void reader(){  //获取锁
        if(flag){
            int i = a;
            ....
        }                              //释放锁
    }

}

下面是该程序在两个内存模型中的执行时序对比图:
这里写图片描述

3.3.4 未同步程序的执行特性

对未同步或未正确同步的多线程程序,JMM只提供最小安全性:线程执行时读取到的值,要么是在之前某个程序写入的值,要么就是默认值(0,Null, False ),JMM保证线程读操作读取到的值不会无中生有的冒出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值