(1)JMM概述

(2)JMM-原子性-synchronized
java内存模型是如何保证原子性的呢,它是通过synchroized关键字,来达到这个目的的

第一个线程来了进入同步代码块之后,把这个对象加上锁了,线程2来了不能执行,只有等到线程1执行完释放锁之后,线程2才有机会获得锁,保证++ -- 指令作为一个整体来运行的


只有有个synchroized关键字的才会有monitor区
owner:monitor监视器的所有者,同一个时刻只能有一个线程成为owner
EntryList排队等候区


这里呢写法是4条虚拟机指令作为一个整体来进行加锁,比如说循环5w次需要执行5w次的Monitr entry指令和monitor exit指令,是比较耗时的,java虚拟机指令对同一个对象做monitor指令,叫做锁注入,显然不太好
可以这样调整代码:Monitr entry指令和monitor exit指令只执行了一次,不会大批量的执行指令了,减少了加锁解锁的次数

(3)JMM-原子性-问题






他跟局部变量的i++字节码是不一样的局部变量时调用iinc的指令,静态变量需要把静态变量和常数放到操作数栈用iasdd完成自增,他不是在局部变量的曹上直接执行的,它是在操作数栈上执行的,执行完之后呢吧结果存入静态变量
所谓的内存模型呢把整个内存分为了两个部分一部分叫主内存,一部分叫做工作内存,不要跟以前的堆栈混淆,他们是在java内存结构中的说法
静态变量时在主存中的,线程啊是在工作内存中的,主存跟工作内存完成数据的交换,getstatic需要从主存读入工作内存,工作内存完成加法,把结果返回到主存中去


整个操作系统线程模型,它是一种抢先试 ,线程呢会轮流拿到CPU的使用权,cpu会以时间片为单位, 在时间片1交给线程一来运行,时间片2交给线程二来运行

(4)JMM-可见性-问题





(5)JMM-可见性-问题解决

多个线程都由写的操作,即使在变量上加了volatile也没有办法保障它的原子性volatile只适合于一个写线程多个读线程的情况

运行 1秒之后会停下来



