【并发】JMM

本文探讨了Java内存模型(JMM),介绍了线程局部变量ThreadLocal的工作原理及其与volatile的交互。文章讨论了重排序的概念,包括编译器和处理器的重排序,并解释了如何通过内存屏障来防止特定类型的重排序。此外,还阐述了happensBefore原则在保证多线程环境下程序正确性方面的重要性。
摘要由CSDN通过智能技术生成

  

前言

  java内存模型是什么样的?threadLocal的应用?volititle如何实现本地内存和住内存的数据同步?重排序?happensBefore原则是这节需要思考的问题。

JMM

这里写图片描述
  java内存模型如上图所示,多个线程对共享变量没有直接采用加锁的方式,而是每个线程可以保留共享变量的副本。每个线程有一个工作内存,叫做threadLocal,共享变量存在threadlocal里的threadlocalMap中,在之后的博客中会详细讨论threadlocal及内存溢出问题。threadLocal之间与共享变量保持一致用的是volatile,工作原理简而言之是这样的,只要一个threadLocal里的变量改了,就会有监视器检测到,让cpu把新值强刷进主存。其他threadLocal在用到该 变量时应用的是CAS乐观锁来保持一致性,先拿自己工作内存中的变量值和主存中的变量值比较如果一样就用该值,如果不一样就用主存中的值替换掉工作内存中的值。
  CAS,threadLocal会在之后的博客总详细讲解,这里就不细说了。

重排序

  好的内存模型除了能存储并保证基本的一致性还要提高性能,所以为提高性能 ,编译器,处理器常常会对指令进行重排序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值