【笔记】深入---java内存模型与线程

因为当前我们的cpu相响应特别快,但是数据从内存到操作空间这段过程相对较慢,引入了高性能的高速缓存存储。

java 内存模型


【笔记】深入---java内存模型与线程_第1张图片

如果非要和java的运行数据区域相匹配的话,

java 线程就是 栈 就是工作内存。 java对象的创建就是在堆也就是主内存。

java 内存间的交互

有8种。

lock,unlock。assign   store write (变量从工作内存到主内存 ) 。 read load use (变量从主内存到工作内存 )。

lock,unlock 分别是为当前线程加锁或解锁,加锁后的变量,将被标记为线程独享。unlock ,解锁。

assign    变量在工作内存被赋值,store 把工作内存的变量传递给主内存 write 真正的放到主内存中。

read   变量由主内存读到工作内存里 load  加载 这个变量, use 使用这个变量。

8个操作8个纪律


重点 volatile 

这个关键字可以干什么?

1 改变变量可见性,我们知道,普通变量的值修改后,需要传递给主内存,然后其他线程才能够看到。但是,改变可见性后,该变量的值对所有线程可见,更改后可以立刻被其他线程看到。

为什么?

因为 它的编译结果相对普通变量多了lock addl $0x0,(%esp),这句指令相当于 执行了一次 store 和write的操作,把内存从工作内存 放到了主内存。

但是根据1 我们是不是可以说,volatitle 变量修饰的运算    在并发下是安全的。答案是不全对的。

为何?


【笔记】深入---java内存模型与线程_第2张图片
z

还有一个 是禁止指令重排序。



个人觉得,指令重排序的作用就是保护 不同cpu访问同一个内存时,数据同步。具体表现是lock addl $0x0,(%esp) 这个操作相当于一个内存屏障,指令重排序时不能将指令放到屏障之前。

你可能感兴趣的:(【笔记】深入---java内存模型与线程)