美文网首页
java线程可见性

java线程可见性

作者: 我不知道得真多 | 来源:发表于2020-02-08 21:44 被阅读0次

一、概念层面的可见性

什么是线程间的可见性?
一个线程对共享变量值的修改,能够及时的被其他线程看到。

    public class App {
    public static boolean  stop = false;

    public static void main(String[] args)  throws InterruptedException  {

        Thread t1 = new Thread(()->{

           int  i = 0; 

           while(!stop){

               i++;

           }

        });

        t1.start();

        Thread.sleep(1000);

        stop = true;
    }
}

上面代码运行会发现,stop 就算值已经被修改了。也没有办法,

线程也不会读取到,程序处于死循环之中,不会退出。

引出下面问题,线程可见性及其基本原理

如果添加了 volatile 情况就会不一样

public  volatile  static boolean  stop = false;

线程保证可见性

1.volatile 保证了线程可见性
2.多了一个Lock 的汇编指令

可见性到底是什么?两个层面分析

  • 硬件
  • JMM层面

CPU 内存、 I/O 设备 读取速度差异

为了最大化利用CPU资源

  1. CPU增加高速缓存
  2. 引入线程、进程
  3. 指令优化 - > 重排序

二、CPU高速缓存,缓存导致不一致问题

cpu层面解决

  1. 总线锁 (总线上加锁,效率低)
  2. 缓存锁 (优化后)

基于MESI 协议可以解决缓存一致性的问题

MESI 表达缓存数据的四种状态
m : modify 、 e : exclusive 、 s :shared 、 i : invalid

MESI表达缓存数据

MESI协议带来的问题 (CPU 通信)

MESI协议带来的问题

cpu 在读缓存过程中,发送消息给其他cpu 时候其他cpu 缓存失效并且在发

送指令给,读取cpu 中,这段时间读取缓存CPU需要阻塞,否则无法保证

缓存一致性,这样也会导致CUP利用率不够。

提出解决方案storebuffer 存储缓冲

比如你需要修改本地缓存中的一条信息,那么你必须将I(无效)状态通知到其他拥有该缓存数据的CPU缓存中,并且等待确认。等待确认的过程会阻塞处理器,这会降低处理器的性能。因为这个等待远远比一个指令的执行时间长的多。当所有失效确认(Invalidate Acknowledge)都接收到时,数据才会最终被提交。
这么做有也有风险,这里不作讨论

硬件内存模型

相关文章

  • volatile的原理和使用

    1.对线程的可见性 Java的volatile关键字声明使变量对不同线程具有可见性。程序在多线程操作non-vol...

  • volatile关键字

    Java 内存模型中的可见性、原子性和有序性。 可见性:可见性,是指线程之间的可见性,一个线程修改的状态对另一个线...

  • 身为JAVA工作者必须了解的实战知识(二)

    一、可见性 什么是可见性? Java线程安全需要防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且需要...

  • Java内存模型

    Java内存的可见性 Java内存模型(Java Memory Model)描述线程之间如何通过内存(memory...

  • java并发中volatile的使用

    java中volatile声明变量,有两个作用 保证变量对所有线程的可见性 禁止指令重排 保证可见性 多线程访问共...

  • 多线程 | Volatile到底有什么用?

    Volatile的作用: 保持内存可见性.内存可见性:多个线程操作同一个变量,可确保写线程更新变量,其他读线程可以...

  • Volatile关键字详解

    基本概念 Java 内存模型中的可见性、原子性和有序性。 可见性:是指线程之间的可见性,一个线程修改的状态对另一个...

  • java内存结构和java内存模型

    java内存模型:与多线程JMM,就是线程可见性有关java内存结构:JVM虚拟机存储空间 class文件被类加载...

  • java线程可见性

    一、概念层面的可见性 什么是线程间的可见性?一个线程对共享变量值的修改,能够及时的被其他线程看到。 上面代码运行会...

  • Java-可见性、原子性、有序性

    关键字:Java内存模型(JMM)、线程安全、可见性、原子性、有序性 1.线程安全(JMM) 多线程执行某个操作的...

网友评论

      本文标题:java线程可见性

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