一.CPU与线程运行方式
image.png-
CPU主要工作就是向内存要一条指令, 执行这个指令, 如果是个跳转指令的话,我就问内存要跳转的目标地址的那一条指令。当然为了提高效率,根据 时间局部性和空间局部性原理,将部分程序缓存在cpu,每次读写指令和数据, 都问cpu缓存要, 缓存没有从内存加载。
-
程序从硬盘加载到内存是根据段表与页表存储的,不同的程序分配不同的段(一块内存空间),一个程序分配一个进程。
image.png -
上下文切换:正在进行的程序随时可以被打断(CPU抢占机制),退出当前进程时,CPU保存当前进程调度状态, 回到内存里歇着去,下一次运行时恢复。
-
线程:把一个进程当成一个资源的容器, 让里边运行几个轻量级的进程, 就叫线程吧, 这些线程共享进程的所有资源, 例如地址空间,全局变量,文件资源等等。
参考:码农翻身
二.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内存模型系列文章
网友评论