java

java并发-锁的内存语义

3.5锁的内存语义

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

3.5.2 锁的释放和获取的内存语义

当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中。

当线程获取锁时,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的 临界区代码必须从主内存中读取共享变量。

3.5.3 锁内存语义的实现

ReentrantLock, volatile+cas

3.5.4 concurrent包的实现

由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现 在有了下面4种方式。

  • 1)A线程写volatile变量,随后B线程读这个volatile变量。
  • 2)A线程写volatile变量,随后B线程用CAS更新这个volatile变量。
  • 3)A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。
  • 4)A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量。

仔细分析concurrent包的源代码实现,会发现一个通用化的实现模式。

首先,声明共享变量为volatile。

然后,使用CAS的原子条件更新来实现线程之间的同步。

同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的 通信。

关于作者

程序员,软件工程师,java, golang, rust, c, python,vue, Springboot, mybatis, mysql,elasticsearch, docker, maven, gcc, linux, ubuntu, centos, axum,llm, paddlepaddle, onlyoffice,minio,银河麒麟,中科方德,rpm