程序是什么?--> QQ.exe PowerPoint.exe
进程是什么?--> 程序启动 进入内存 资源分配的基本单位
线程是什么?--> 程序执行的基本单位
程序如何开始运行?--> CPU 读指令 - PC(存储指令地址) ,读数据 Register ,计算, 回写, -> 下一条
线程如何进行调度?--> linux 线程调度器(OS)操作系统
线程切换的概念是什么?--> Context Switch CPU保存现场 执行新线程,恢复现场,继续执行原线程这样的一个过程
可见性
线程间的可见性
多线程提高效率,本地缓存数据,造成数据修改不可见,
要想保证可见,要么触发同步指令,要么加上volatile,被修饰的内存,只要有修改,马上同步涉及到的每个线程
用volatile保障可见性
* volatile 关键字,使一个变量在多个线程间可见
* A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道
* 使用volatile关键字,会让所有线程都会读到变量的修改值
* 在下面的代码中,running是存在于堆内存的t对象中
* 当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个copy,并不会每次都去
* 读取堆内存,这样,当主线程修改running的值之后,t1线程感知不到,所以不会停止运行
* 使用volatile,将会强制所有线程都去堆内存中读取running的值
* volatile并不能保证多个线程共同修改running变量时所带来的不一致问题,也就是说volatile不能替代synchronized
public class T01_HelloVolatile {
private static volatile boolean running = true;
private static void m() {
System.out.println("m start");
while (running) {
//System.out.println("hello");
}
System.out.println("m end!");
}
public static void main(String[] args) {
new Thread(T01_HelloVolatile::m, "t1").start();
SleepHelper.sleepSeconds(1);
running = false;
}
}
缓存行对齐
- 缓存行对齐 缓存行64个字节是CPU同步的基本单位,缓存行隔离会比伪共享效率要高 Disruptor
- 认识缓存行对齐的编程技巧