首页 > 科技 > 你真的了解JVM?浅谈那些你不得不知的JMM内存模型

你真的了解JVM?浅谈那些你不得不知的JMM内存模型

JMM 内存模型

ID问题

1.为什么需要JMM

2JMM是什么

3.JMM的重点内容

1.为什么需要JMM

 ① 依赖处理器不同处理器处理的结果可能不一样
② 没有办法保证并发的安全
③ 需要一个标准让多线程可预期

2.JMM是什么

 ① Java memory model 需要各个JVM来遵守JMM规范以便开发者利用这些规范来开发多线程的程序
如果没有这样的一个JMM内存模型来规范 那么可能经过不同的规则重排序之后导致不同虚拟机
上运行的结果不一样 产生很大的问题

② volatile synchornized lock 等原理都是JMM 如果没有JMM那就是需要我们自己指定什么时候让
主内存与工作内存拷贝

3.JMM的重点内容

1.重排序

2.可见性

3.原子性

发生-在原则之前

ID问题

1.什么是发生在原则之前

2.发生-在规则有哪些之前

1.幸福-在是什么之前

发生-在规则是用来解决可见性问题的之前在时间上A动作在B动作之前发生B能保证看到A这就是发生之前

俩个操作可以用发生在来确定他们的执行顺序之前如果一个操作发生在与另一个操作那么我们就说第一个操作对于第二个操作时可见的之前

2.幸福-在的规则有哪些之前

1单线程规则

一个线程内保证了语义的串行性

2锁操作(同步和锁)

(对于在解锁一个锁之前的所有操作对于加锁这个锁之后的所有操作是可见的(解锁必然发生在随后的加锁前)

3挥发性变量

挥发性变量的写先发生于读这就保证了挥发性的可见性

近朱者赤FieldVisibility.java给b加挥发性会影响全局实现轻量级同步

B之前写入的代码对读取b后的代码都可见所以在写者线程里面对a的赋值一定会对读取器线程里面的读取可见所以这里a即使不加valitile b读到3就可以由发生在的原则保证读取到的都是3而不是1之前

4线程启动

线程对象的start()方法发生-在此线程的每一个动作之前

5线程连接

如果线程A执行操作ThreadB.Join()并成功返回,那么线程B中的任意操作发生在于线程A从ThreadB.Join()操作成功返回之前

6传递性

如果操作A发生-在操作B之前,操作B发生之前-操作C之前,那么可以得出A发生之前-在操作C之前

7中断

对线程中断()方法的调用发生-在发生于被中断线程的代码检测到中断时事件的发生之前

8构造方法

9工具类发生在原则之前

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.sosokankan.com/article/1767558.html

setTimeout(function () { fetch('http://www.sosokankan.com/stat/article.html?articleId=' + MIP.getData('articleId')) .then(function () { }) }, 3 * 1000)