2 java内存模型是什么_什么是内存模型,为什么需要它?

JAVA内存模型

在多线程这一系列中,不去探究内存模型的底层

一、什么是内存模型,为什么需要它

在现代多核处理器中,每个处理器都有自己的缓存,定期的与主内存进行协调;

想要确保每个处理器在任意时刻知道其他处理器正在进行的工作,将需要很大的开销;且通常是没必要的

我们只有在需要跨线程共享数据时,才需要知道信息;而在JAVA中就是通过正确的同步来实现

1.重排序

如下:判断输出的值将十分困难

public class PossibleReordering {static int x = 0, y = 0;static int a = 0, b = 0;/** * 判断输出值将会非常困难:

* 1:多线程之间的切换,导致可能的输出值:(0,1)(1,0)(1,1)

* 2.指令重排序:one线程如a=1和x=b之间重排序,x=b(0),然后other线程被调度执行y=a(0),将导致(0,0) */public static void main(String[] args) throws InterruptedException {

Thread one = new Thread(new Runnable() {public void run() {

a = 1;

x = b;

}

});

Thread other = new Thread(new Runnable() {public void run() {

b = 1;

y = a;

}

});

one.start();

other.start();

one.join();

other.join();

System.out.println("( " + x + "," + y + ")");

}

}

2.JAVA内存模型简介

偏序关系:反对称、自反和传递属性;但是对于任意的两个元素A和B,并不一定满足A偏向B或B偏向A的关系

如:A和B之间我更偏向B,但是我没必要明确的做出选择

JMM为程序中所有的操作定义了一个偏序关系,称之为Happens-Before;要想保证执行B操作的线程看到执行A操作的线程的结果,无论AB是否在同一线程,必须满足Happens-Before关系,否则JVM就会对其重排序

7986b85dcbde74439d576d66ba595911.png

如:加锁操作,就可以预知执行顺序,多个线程之间就符合Happens-Before,不加锁则无法判断线程之间的调度,

b9309a2a30ecba6185bfe58a26d2a56f.png

3.发布

真正原因:发布一个共享对象 和 在另一个线程中访问该对象之间没有Happens-Before关系;由于指令重排序,导致对象没有正确构建则被发布

public class UnsafeLazyInitialization {private static Resource resource;/** * 除了竟态条件问题检查后执行,还有不安全发布的问题

* 如:一个线程A进来,看到resource为null,则实例化并返回;另一个线程B进来看到resource不为null直接返回

* 如果在线程A中对resource进行了修改,则可能在线程B中看不到resource的正确状态 */public static Resource getInstance() {if (resource == null)

resource = new Resource(); // unsafe publicationreturn resource;

}static class Resource {

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值