进程是系统分配资源的基本单位,线程是调度cpu的基本单位,一个进程至少包含一个执行线程,线程寄生在进程之中。每个线程都有一个程序计数器(记录要执行的下一条指令),一组寄存器(保存当前线程的的工作变量),堆栈(记录执行历史,其中每一帧保存了一个已经调用但未返回的过程)
线程分为两类- 用户级线程(ULT),cpu权限级别ring3普通用户可 *** 作
- 内核级线程(KLT),cpu权限级别ring0才可 *** 作
- 内核空间,KLT
系统核心跑在内核空间,ring0才有权限创建线程
- 用户空间,ULT
进程(JVM虚拟机,ps,word等)跑在用户空间,通过交互接口来跑内核空间的线程。只要主进程进行切换会发生阻塞。
volatile解决了并发编程的可见性
JMM(java内存模型)工作内存 = 虚拟机栈
主内存 = 方法区 + 堆(jdk7及之前,静态属性在方法区),主内存 = 堆(jdk1.8及以后)
JVM(虚拟机内存模型) 指令重排- 一种现象,而非一种动作
- cpu为了提升效率其实是乱序执行代码,优点性能高
- 什么样代码会乱序执行?as-if-serial语义(乱序执行的一种约束),所有的 *** 作可以为了优化重新排序,但是必须保重排序后结果不能改变
Java层面:
没有发生重排
Hotspot层面:
发生了重排,提高cpu利用率,GCC编译优化(默认O2级优化):优化无效代码,进行简单运算,指令乱排序
DCL为什么加volatile?DCL:双重检查,是一种单例模式,加不加都没问题
屏障:内存屏障
编译屏障
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)