一.背景知识

一.CPU与线程运行方式

image.png
  • CPU主要工作就是向内存要一条指令, 执行这个指令, 如果是个跳转指令的话,我就问内存要跳转的目标地址的那一条指令。当然为了提高效率,根据 时间局部性和空间局部性原理,将部分程序缓存在cpu,每次读写指令和数据, 都问cpu缓存要, 缓存没有从内存加载。

  • 程序从硬盘加载到内存是根据段表与页表存储的,不同的程序分配不同的段(一块内存空间),一个程序分配一个进程。


    image.png
  • 上下文切换:正在进行的程序随时可以被打断(CPU抢占机制),退出当前进程时,CPU保存当前进程调度状态, 回到内存里歇着去,下一次运行时恢复。

  • 线程:把一个进程当成一个资源的容器, 让里边运行几个轻量级的进程, 就叫线程吧, 这些线程共享进程的所有资源, 例如地址空间,全局变量,文件资源等等。

image.png

参考:码农翻身

二.java内存模型

  • Java内存模型(Java Memory Model,JMM) 是对Java并发编程中线程与内存的关系的定义,即线程间的共享变量存储在主内存(Main Memory) 中,每个线程都有一个私有的本地工作内存(Local Memory)(对CPU寄存器和高速缓存的抽象)
    image.png
  • 一致性的问题。目前处理一致性问题主要有共享内存和消息通信这两个大的方式,每种方式里面又根据不同的需求有不同的实现方式。Java内存模型处理的就是单机器多CPU场景下的内存一致性问题。如果程序是正确同步的,程序的执行将具有顺序一致性(sequentially consistent)–即程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。这里的同步是指广义上的同步,包括对常用同步原语(lock,volatile和final)的正确使用。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系。
  • 内存可见性(数据同步):Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证线程工作内存中修改的值会立即被更新到主内存中,其他线程也会将主内存中的新值同步至工作内存,需要注意的是volatile并不能保证原子性。
  • 加锁就是就是取消进程的某一线程的行动权

参考:
1.聊聊高并发(三十四)Java内存模型那些事(二)理解CPU高速缓存的工作原理
2.查看《浅析Java并发编程》系列文章目录
3.深入理解java内存模型系列文章

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,995评论 0赞 11
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 43,070评论 11赞 349
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,828评论 25赞 708
  • 东极岛旅行笔记 DAY1 南京站动车出发,约12:30到达宁波 宁波南站-沈家门客运中心 (普陀客运中心),约两2...
    6a523780fdc5阅读 480评论 0赞 2
  • 10月16日,华为在德国慕尼黑发布了新款旗舰Mate 10系列手机,伴随而来的便是人工智能芯片麒麟970,其中普通...
    科技巢阅读 319评论 0赞 0

友情链接更多精彩内容