美文网首页
【Java并发(六)】--Java内存模型之锁的内存语义

【Java并发(六)】--Java内存模型之锁的内存语义

作者: 小安的大情调 | 来源:发表于2018-11-16 16:41 被阅读0次

如未作特殊说明,文章均为原创,转发请注明出处。

[TOC]

前言

​ 上篇文章详细分析了volatile的内存语义,并且介绍了是如何实现线程之间通信,可见性。保证单个操作下的volatile变量的原子性。并且将其的内存语义与锁做了对比。那么本章就来详细的分析锁的内存语义。


锁的内存语义

​ 一提到锁,大家自然而然地想到前面分析过地synchronized关键字。 它是JAVA并发编程中最重要地同步机制。锁可以让临界区(同步块)互斥(独占锁)。下面来分析以下锁地另一个同样非常重要地锁地内存语义。

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

​ 通过一段代码来具体地分析以下锁地释放和获取建立的happens-before关系。

public class MonitorExample{
    int a = 0;
    public synchronized void write(){   // 1
        a++;                            // 2
    }                                   // 3
    public synchronized void read(){    // 4
        int i = a;                      // 5
    }                                   // 6
}

假设线程A执行write()线程B执行read(),两个方法都使用synchronized进行同步,并且锁对象是同样的(两个线程同一把锁),那么很显然,如果线程A先执行,那么线程B只能等到线程A执行完之后释放锁,获取锁之后才能真正的执行read()

​ 那么可以得出结论是:

  • 1 happens-before 2
  • 2 happens-before 3
  • 3 happens-before 4
  • 4 happens-before 5
  • 5 happens-before 6

根据锁的获取跟释放关系 : 3 happens-before 4

根据happens-before的传递性: 2 happens-before 5

这里可以推测出,当线程A释放锁的同时,所有锁内的共享变量将对线程B可见。(类似于volatile的内存语义)这种操作也可以看作两个不同的线程通过主内存来通信。实现共享变量在多线程下的原子性。

锁的释放-获取的内存语义

​ 当线程A释放锁时,会将修改后的变量刷新到主内存,那B线程在拿到锁后会将本地内存缓存的值置为无效,那么在临界代码块中的共享变量就必须要从主内存中重新获取。

线程A将新的数据刷新到主内存,并且释放锁,等待线程B获取锁!
在线程A执行完后,所有等待这把锁的线程的本地内存缓存的数据都会被置为无效,在线程B执行的时候,必须重新在主内存中读取。
线程B在获取锁之后,可重新读取共享变量
这样看来锁的释放-获取内存语义volatile的写-读内存语义有异曲同工之处。

下面给锁的获取-释放内存语义做个小的总结

锁的释放-获取内存语义小结

  • 线程A在释放一个锁,实质上时线程A向接下来要获取该锁的线程发出了(线程A对共享变量所做修改的)消息。
  • 线程B获取一个锁,实质上是线程B接收了之前某个线程发出的(在释放这个锁之前对共享变量所做的修改的)消息。所以获取这个锁之后,所有的共享变量必须重新到主内存中读取。
  • 线程A释放锁,随后线程B获取这个锁,这个过程实质上是线程A通过主内存向线程B发送消息。

锁内存语义的实现

​ 这里等深入了解了AQSjava同步框架AbstractQueuedSynchronizer。

相关文章

  • 【Java并发(六)】--Java内存模型之锁的内存语义

    如未作特殊说明,文章均为原创,转发请注明出处。 [TOC] 前言 ​ 上篇文章详细分析了volatile的内存...

  • 聊聊java内存模型

    本文目录 Java内存模型 重排序 内存屏障 volatitle的内存语义 final的内存语义 一、Java内存...

  • 多线程

    java并发,java内存模型,java锁https://github.com/CyC2018/CS-Notes/...

  • Java基础之内存模型

    Java基础之内存模型 目录 Java内存模型简单介绍 JVM介绍 存储方式 并发原因 Java内存模型与系统内存...

  • JAVA内存模型笔记(JMM)

    JAVA内存模型 这里做的笔记是结合JVM中的java内存模型 和java并发编程艺术中讲的java内存模型 再结...

  • 《java并发编程实战》之java内存模型

    “如欲征服java并发,需先征服java内存模型,如欲征服java内存模型,需先征服计算机内存模型” -awork...

  • (005)java中的内存模型

    概述 在java中应为不同的目的可以将java划分为两种内存模型:gc内存模型。并发内存模型。 gc内存模型 ja...

  • Java 内存模型-锁的内存语义

    章节目录 锁的释放-获取建立的 happens-before 关系 锁的释放-获取的内存语义 锁的释放-获取 建立...

  • JVM连载(2)

    JMM Java内存模型: 1、 Java的并发采用“共享内存”模型,线程之间通过读写内存的公共状态进行通讯。多个...

  • Java并发编程脑图

    01-Java内存模型 02-并发基础 03-锁 04-并发工具类 05-其他 06-Java并发集合 07-at...

网友评论

      本文标题:【Java并发(六)】--Java内存模型之锁的内存语义

      本文链接:https://www.haomeiwen.com/subject/ajwmfqtx.html