引言
熟悉并发的童鞋们都知道,并发编程有三大特性,分别是可见性、有序性、原子性,今天我们从一个demo中分析可见性,以及我们如何保障可见性。
JMM模型
在我们分析可见性之前,我们需要了解一个概念,就是JMM模型,也就是我们常说的java memory model .
java虚拟机规范中定义了Java内存模型,用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现程序在各个平台上达到一致的并发效果,JMM规范了java虚拟机与计算机内存是如何协同工作的。规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。JMM描述的是一种抽象的概念,一组规则,通过这组规则控制程序中各个变量在共享数据区域和私有数据区域的访问方式。
上代码
package com.tuling.juc.service;
import com.tuling.concurrent.lock.UnsafeInstance;
import com.tuling.juc.Factory.UnsafeFactory;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
/**
* @Description
* @Author zhenghao
* @Date 2021/10/28 18:26
**/
public class VisibilityTest {
//volatile 是通过内存屏障来实现 可见性 ,汇编层面 会在执行的指令前面 增加 lock关键字
//lock 关键字 可以起到和内存屏障一样的作用,但不是内存屏障
//lock 前缀指令 会等待它之前所有的指令都完成,并且所有缓冲的写操作写会内存
private volatile boolean flag = true;
private int count = 0;
public void refresh() {
flag = false;
System.out.println(Thread.currentThread().getName() +