1.并发与高并发的基本概念
- 并发:同时拥有两个或者多个线程。如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程时同时“存在”的。每个线程都处于执行过程中的某个状态,如果运行在多核处理器上。此时,程序中的每个线程都将分配到一个处理器上,因此,可以同时运行。
- 高并发:HighConcurrency是互联网分布式系统架构设计中必须考虑的因素之一。他通常指,通过设计保证系统能够同时并行处理很多请求
所以总结
- 并发:多个线程操作相同的资源,保证线程安全,合理使用资源
- 高并发:服务器能同时处理很多请求,提高程序性能
2. 并发基础
2.1 CPU多级缓存 - 缓存一致性
1. 为什么需要CPU缓存
CPU频率太快了,快到主存跟不上,这样在处理器时钟周期内,CPU常常需要等待主存,浪费资源。缓存的出现是为了缓解CPU和内存之间速度的不匹配问题
2. CPU 缓存意义
- 时间局部性:如果某个数据被访问,那么在不久的将来它可能会被再次访问
- 空间局部性:如果某个数据被访问,那么与他相邻的数据很快也可能被访问到
缓存一致性(MESI)
2.2 CPU多级缓存 - 乱序执行优化
2.3 Java内存模型
Java内存模型规范它规定了一个线程如何和何时看到由其他线程修改过后的共享变量的值以及在必须时如何同步的访问共享变量
同步的八种操作
-
lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态
-
unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
-
read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用功能
-
load(载入):作用于工作内存的变量,他把read操作从主内存中得到的变量值放入工作内存的变量副本中
-
use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎
-
assign(赋值):作用于工作内存的变量,他把一个从执行引擎接收到的值赋值给工作内存的变量
-
store(存储):作用于工作内存的变量,把工作内存中的一个变量值传送到主内存中,以便随后的write操作
-
write(写入):作用于主内存的变量,他把store操作从工作内存中的一个变量的值传递到主内存的变量中
2.4 线程安全性概念
线程安全体现在三个方面
- 原子性:提供了互斥访问,同一时刻只能有一个线程操作
- 可见性 :一个线程对主内存的修改可以及时的被其他线程观察到
- 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重新排序的存在,该观察结果一般杂乱无序
2.5 Synchronized与Lock的对比
- synchronized:不可中断锁,适合竞争不激烈,可读性好
- lock:可中断锁,多样化同步,竞争激烈时能维持常态
- atomic:竞争激烈时能维持常态,比lock性能好,只能同步一个值
2.6 可见性 volatile
通过加入 内存屏障 和 禁止重排序 优化来实现
- 对volatile变量写操作时,会在写操作后加入一条store屏障指令,将本地内存中的共享变量刷新到主内存
- 对volatile变量读操作时,会在读操作前加入一条load屏障指令,从主内存中读取共享变量
2.7 有序性
Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序的过程不会单线程程序的运行,却会影响到多线程并发执行的准确性