jvm模型---JMM

一、JVM模型

       简称JMM

        java内存模型围绕三个特性来建立的:原子性,可见性,有序性

(1)原子性

        类似事务,要么执行完毕,要么不执行   

(2)可见性

       一个线程对共享变量做了修改之后,其他的线程立即能够看到(感知到)该变量这种修改(变化)

       

      java虚拟机规范师徒定义一种java内存模型,来屏蔽各种硬件和操作系统的内存访问差异,让java程序在各种平台上都能达到一致的内存访问效果。简单的说:由于CPU执行指令的速度是很快的,但是内存访问的速度就慢了很多,相差的不是一个数量级,所以出现了高速缓存,JMM规定所有变量都是存在主内存中,每个线程又包含自己的工作内存。线程的操作是以工作内存为主,他们只能访问自己的工作内存,且工作前后都要把值同步回内存中。

      除了volatile关键字能实现可见性之外,还有synchronized,Lock,final也是可以的。

(3)有序性

       JMM是允许编译器和处理器对指令重排序的,但是规定了as-if-serial语句,即不管怎么重排序,程序的执行结果不能改变,

如:   A和B可以重排序,C依托A和B,所以C不能和A,B重排序。

 int a=3;   //a
 int b=4;   //b
 int d=a*b;  //c 

JMM保证了重排序不会影响到单线程的执行,但是在多线程却容易出问题,

    int a=0;
    boolean flag=false;
    
    public void add(){
        a=2;
        flag=true;
    }
    
    public void  remove(){
        if(flag){
            int end=a*a;
        }
    }

线程啊运行了write方法,指令重排序,先运行的是flag=true;线程B运行的是remove方法,这时候flag为true,但是a还为0,所以运行就出现异常。

 

(4)扩展:

       被volatile修饰的共享变量,具有两点特性:

  • 保证了不同线程对该变量操作的内存可见性
  • 禁止指令重排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值