1、多并发缓存架构
1.1 图解
2、JMM内存模型(Java内存模型)
2.1 建立:
Java线程内存模型与cpu缓存模型类似,是基于cpu缓存模型来建立的,Java线程内存模型是标准化的,屏蔽了底层不同计算机的区别
2.2 代码解释工作内存
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
int num = 0;
System.out.println(" ------ start");
while (!flag){
// System.out.println("thread 1 : " + num ++ );
}
System.out.println( " ------------ success");
}
}).start();
Thread.sleep(20000);
new Thread(new Runnable() {
@Override
public void run() {
prepared();
}
}).start();
}
public static void prepared(){
System.out.println("start ----- ");
flag = true;
System.out.println("end -------");
}
运行结果:
------ start
start -----
end -------
死循环
2.3 volatile关键字:
1、
private static volatile boolean flag = false;
2、上述代码加入 volatile 之后的运行结果:
------ start
start -----
end -------
------------ success
3、解释:保证了共享变量在多个线程之间的缓存或者说副本变量值之间有相互可见性
将数据马上同步回主内存,保证了数据的时效性
4、底层实现:
主要是通过汇编lock前缀指令,他会锁定这块区域的缓存,并回写到主内存
lock前缀指令
2.4 JMM数据原子操作
1、八种原子操作:
2、运行过程
3、总线加锁:
lock,标识为这个线程独占状态
4、解锁:
unlock
5、总线
6、实现:
c语言实现
2.5 MESI总线缓存一致性协议
1、概念:多个cpu从主内存中读取同一个数据到各自的高速缓存,当其中某个cpu修改了缓存里的数据,该数据马上会同步回主内存,其他cpu通过总线嗅探机制可以感知到数据的变化从而将自己缓存中的数据失效
2、监听
3、并发编程的三大特性
3.1 三大特性:
1、可见性、原子性、有序性
3.2
volatile保证可见性与有序性,但是不保证原子性,保证原子性需要借助synchronized这样的锁机制
3.3
join方法:等待线程执行完
3.4 例子
1、代码
private static volatile int num = 0;
public static void main(String[] args) throws InterruptedException {
Thread [] threads = new Thread[10];
for (int i = 0 ; i < threads.length ; i++ ) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int n = 0; n < 1000 ; n++) {
numPlus();
}
}
});
threads[i].start();
}
for (Thread t : threads) {
t.join();
}
System.out.println(num);
}
public static void numPlus (){
num ++ ;
}
2、运行结果:
9529
3、分析:
结果 <= 10000
数据丢失
volatile不能保证原子性