【多线程:volatile】原理

简介: 【多线程:volatile】原理

【多线程:volatile】原理

01.介绍

volatile的底层实现原理是内存屏障

1.对volatile变量的写指令后会加入写屏障
2.对volatile变量的读指令前会加入读屏障

02.volatile保证可见性原理

写屏障:保证在该屏障之前的,对共享变量的改动都同步到主存当中。

    public void actor2(I_Result r){
        num = 2;
        ready = true; // ready是volatile修饰的,且ready是写操作
        // ready后有写屏障
    }

读屏障:保证在该屏障之后,对共享变量的读取,加载的是主存中的最新数据

    public void actor1(I_Result r){
        // 因为ready是读操作
        // 在ready之前有读屏障
        if(ready){
            r.r1 = num + num;
        }else{
            r.r1 = 1;
        }
    }

解释

写屏障可以保证自己和自己之前的共享变量 都同步到主存中,就像这里的num = 2是在ready = true之前,那么共享变量ready与num都会同步到主存当中
读屏障则是可以保证自己和自己之后的共享变量读取都是最新的,例如这里if(ready)就读取了ready 还有 r.r1 = num + num,这里读取了num
总结:通过读写屏障保证了 加了volatile的变量不论是写还是对都是最新的数据,且 对于写之前 读之后的数据也都是最新数据。这就是可见性实现的原理。

03.volatile保证有序性原理

写屏障:确保指令重排序时,不会将写屏障之前的代码排在写屏障之后。

    public void actor2(I_Result r){
        num = 2;
        ready = true; // ready是volatile修饰的,且ready是写操作
        // ready后有写屏障
    }

读屏障:确保指令重排序时,不会将读屏障之后的代码排在读屏障之前。

    public void actor1(I_Result r){
        // 因为ready是读操作
        // 在ready之前有读屏障
        if(ready){
            r.r1 = num + num;
        }else{
            r.r1 = 1;
        }
    }

解释

写屏障确保指令重排序时,不会将写屏障之前的代码排在写屏障之后,例如这个例子中的ready = true是读操作,保证了ready之前的代码不会出现在ready之后
读屏障则是确保指令重排序时,不会将读屏障之后的代码排在写屏障之前,例如这个例子中的if(ready)保证了ready之后的代码不会出现在ready之前,不过这里ready不存在这个问题 因为这里只有ready为true时才能进入
总结:通过读写屏障保证了 加了volatile的变量写之前的代码不会出现在写屏障之后 这就保证了 这个变量的位置固定,同时读屏障保证了读屏障之后的代码不会出现在读屏障之前 也保证了位置固定,所以在写这个变量时 这个变量不会出现指令重排序,读这个变量时 这个变量也不会出现指令重排序,保证了有序性。

目录
相关文章
|
1月前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
1月前
|
Java
并发编程之线程池的底层原理的详细解析
并发编程之线程池的底层原理的详细解析
58 0
|
2天前
|
存储 设计模式 并行计算
CopyOnWriteArrayList:深入理解Java中的线程安全List原理和应用
CopyOnWriteArrayList:深入理解Java中的线程安全List原理和应用
|
2天前
|
缓存 监控 Java
深入Elasticsearch:线程池的原理与应用
深入Elasticsearch:线程池的原理与应用
|
2天前
|
Java
线程池ThreadPoolExcutor源码剖析---工作原理
线程池ThreadPoolExcutor源码剖析---工作原理
|
29天前
|
监控 Java 调度
Java并发编程:线程池的原理与实践
【5月更文挑战第30天】 在现代软件开发中,尤其是Java应用中,并发编程是一个不可忽视的领域。线程池作为提升应用性能和资源利用率的关键技术之一,其正确使用和优化对系统稳定性和效率至关重要。本文将深入探讨线程池的核心原理、常见类型以及在实际开发中的使用案例,旨在帮助开发者更好地理解和运用线程池技术,构建高性能的Java应用程序。
|
1月前
|
安全 Java 编译器
Java 多线程系列Ⅴ(常见锁策略+CAS+synchronized原理)
Java 多线程系列Ⅴ(常见锁策略+CAS+synchronized原理)
|
1月前
|
安全 Java 开发者
谈谈Java线程同步原理
【5月更文挑战第24天】Java 线程同步的原理主要基于两个核心概念:互斥(Mutual Exclusion)和可见性(Visibility)。
16 3
|
14天前
|
缓存 算法 Java
深入解析线程上下文切换的原理与优化策略
深入解析线程上下文切换的原理与优化策略
19 0
|
1月前
|
消息中间件 安全 Ubuntu
【操作系统原理】—— 线程同步
【操作系统原理】—— 线程同步
26 1

热门文章

最新文章