Java的内存模型

 

        每个线程都会有自己独立的工作内存,当线程需要使用主内存中的某个变量时将会把主内存中的变量拷贝一份放入工作内存,而当两个线程同时使用了一个内存变量,当其中一个线程改变了改变了该变量的值,由于另一个线程还在处于工作状态,没来的及将工作内存中的值更新过来,就会造成使用的还是原来的值 。

JMM体现在以下几个方面:

  • 原子性-如何保证指令不会受到线程上下文切换的影响。线程上下文切换主要指运行态和阻塞态之间的转换,这个切换消耗成本较大
  • 可见性-如何保证指令不受工作内存(cpu缓存)的影响
  • 有序性-如何保证指令不受cpu指令并行优化的影响
synchronized可以保证原子性、可见性,线程中只要遇到synchronized锁,就会从主存中更新工作内存。但是synchronized关键字不能保证有序性。

A a=new A();

1.开辟一块内存空间(空白内存空间)

2.对象初始化(属性赋初值等)

3.将引用赋予变量a

在很多线程做线程优化时顺序往往时132(这就是指令重排)

我们可以看到当线程将stop读取到自己的工作内存时一直处于工作状态,而将主线程将主存中的值改了之后,该线程读的还是自己工作内存中的值,并没有停下来的迹象。

而我们如果可以让该线程在运行中睡眠一会,将cpu让给别人,那么这是就将会更新数据。

也就是说,当变量的操作在被锁定的代码块中,线程进入这段代码时,会自动将主存的数据更新到工作内存中,离开这段代码前会将工作内存的数据回写在主存中。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值