深入理解java内存模型——锁

让自己行动起来 让自己行动起来     2022-08-01     196

关键词:

锁的释放-获取建立的happens before 关系

锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。

下面是锁释放-获取的示例代码:

class MonitorExample {
    int a = 0;

    public synchronized void writer() {  //1
        a++;                             //2
    }                                    //3

    public synchronized void reader() {  //4
        int i = a;                       //5
        ……
    }                                    //6
}

假设线程A执行writer()方法,随后线程B执行reader()方法。根据happens before规则,这个过程包含的happens before 关系可以分为两类:

 
  1. 根据程序次序规则,1 happens before 2, 2 happens before 3; 4 happens before 5, 5 happens before 6。
  2. 根据监视器锁规则,3 happens before 4。
  3. 根据happens before 的传递性,2 happens before 5。

上述happens before 关系的图形化表现形式如下:

技术分享

在上图中,每一个箭头链接的两个节点,代表了一个happens before 关系。黑色箭头表示程序顺序规则;橙色箭头表示监视器锁规则;蓝色箭头表示组合这些规则后提供的happens before保证。

转自:http://www.infoq.com/cn/articles/java-memory-model-5&

深入理解java内存模型——锁

本文属于作者原创,原文发表于InfoQ:http://www.infoq.com/cn/articles/java-memory-model-5锁的释放-获取建立的happensbefore关系锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程... 查看详情

深入理解java内存模型——volatile

volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例... 查看详情

深入理解java内存模型——volatile

volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例... 查看详情

深入理解java内存模型——volatile

本文属于作者原创,原文发表于InfoQ:http://www.infoq.com/cn/articles/java-memory-model-4volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是... 查看详情

深入理解java内存模型

目录前言适用人群1 基础并发编程模型的分类Java内存模型的抽象重排序处理器重排序与内存屏障指令 查看详情

转深入理解java内存模型

...,及其与处理器内存模型和顺序一致性内存模型的关系。深入理解java内存模型(一)——基础深入 查看详情

从cpu讲起,深入理解java内存模型!

Java内存模型,许多人会错误地理解成JVM的内存模型。但实际上,这两者是完全不同的东西。Java内存模型定义了Java语言如何与内存进行交互,具体地说是Java语言运行时的变量,如何与我们的硬件内存进行交互的。而JVM内存模型... 查看详情

从cpu说起,深入理解java内存模型!(代码片段)

Java内存模型,许多人会错误地理解成JVM的内存模型。但实际上,这两者是完全不同的东西。Java内存模型定义了Java语言如何与内存进行交互,具体地说是Java语言运行时的变量,如何与我们的硬件内存进行交互的。... 查看详情

深入理解java的内存模型与线程并发问题

文章大部分内容参考《深入理解Java虚拟机》!!!一、引言为什么要了解java的内存模型?java的内存模型是程序运行的基础知识,对于我们理解java的并发编程有一定的帮助,甚至一些并发知识的底层实现... 查看详情

十深入理解java内存模型

深入理解Java内存模型【1】CPU和缓存的一致性?我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存放在主存当中的,也就是计算机的物... 查看详情

深入理解java内存模型——基础

并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机... 查看详情

深入理解java内存模型——基础

并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机... 查看详情

深入理解java内存模型(jmm)(代码片段)

文章目录1、多核并发缓存架构2、Java内存模型(JMM,JavaMemoryModel)3、JMM数据原子操作(干货)3.1read——读取3.2load——载入3.3use——使用3.4assign——赋值3.5store——存储3.6write——写入3.7lock——锁定3.8unlock——... 查看详情

深入理解jvm——jvm内存模型

...地方法栈 4.堆 5.方法区。下面对这五个区域展开深入的介绍。 1.程序计数器1.1.什么是程序计数器?程序计数器是一块较小的内存空间,可以把它看作当前线程正在执行的字节码的行号指示器。 查看详情

深入理解java虚拟机jvm内存模型

文章目录前言一、JVM内存模型1.程序计数器2.Java虚拟机栈3.本地方法栈4.Java堆5.方法区6.运行时常量池7.直接内存结尾前言对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”&... 查看详情

深入理解java虚拟机jvm内存模型

文章目录前言一、JVM内存模型1.程序计数器2.Java虚拟机栈3.本地方法栈4.Java堆5.方法区6.运行时常量池7.直接内存结尾前言对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”&... 查看详情

深入理解java内存模型——顺序一致性

本文属于作者原创,原文发表于InfoQ:http://www.infoq.com/cn/articles/java-memory-model-3数据竞争与顺序一致性保证当程序未正确同步时,就会存在数据竞争。java内存模型规范对数据竞争的定义如下:在一个线程中写一个变量,在另一个... 查看详情

深入理解java内存模型——final

本文属于作者原创,原文发表于InfoQ:http://www.infoq.com/cn/articles/java-memory-model-6与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个... 查看详情