![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JMM
striveb
趁年轻,多吃点苦吧
展开
-
Java并发机制的底层实现原理
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。 一、volatile的应用 1.volatile的定义与实现原理 Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了v...原创 2019-01-24 13:05:38 · 142 阅读 · 2 评论 -
java内存模型之重排序和顺序一致性
1 Java内存模型的基础 1.1 并发编程模型的两个关键问题 在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。 在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。 在消息传递的并发模型里,...原创 2019-01-26 22:26:34 · 688 阅读 · 0 评论 -
java内存模型之volatile和锁的内存语义
1.volatile的内存语义 1.1 volatile的特性 可以把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。如下面的例子: class VolatileFeaturesExample { volatile long vl = 0L; // 使用volatile声明64位的long型变量 public void set(long l) { ...原创 2019-01-26 22:33:52 · 241 阅读 · 0 评论 -
Java内存模型之final的内存语义和happens-before
一、final域的内存语义 1 final域的重排序规则 对于final域,编译器和处理器要遵守两个重排序规则: 1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。(即对构造函数的写入要在这个对象被其他线程看到之后) 2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。 p...原创 2019-01-26 22:36:31 · 619 阅读 · 0 评论 -
java内存模型之双重检测锁和延迟初始化
1 双重检查锁定及其存在的问题 在单例模式中,普通的单例模式是线程不安全的,如下: //懒汉式,线程不安全 public static class SingleTon2 { public static SingleTon2 instance = null; private SingleTon2() { } public static SingleTon2 ...原创 2019-01-26 22:38:09 · 213 阅读 · 0 评论