面3-Java内存模型、JMM剖析与高并发优化

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不能保证原子性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值