• volatile


    java虚拟机提供的轻量级的同步机制(乞丐版的synchronized)

    具备三个性质:保证可见性,防止指令重排,但是无法保证原子性

    前置知识:                                                                                                                                                        java内存模型 (Java Memory Model) JMM_Pr Young的博客-CSDN博客                    

     JMM这组规范关于同步的规定:

    1.线程解锁前,必须把共享变量的值刷新回主内存

    2.线程加锁前,必须读取主内存的最新值到自己的工作内存

    3.加锁和解锁是同一把锁

    并发编程中存在三个问题:可见性,原子性,有序性

    1.保证可见性:当一个线程修改了某个共享变量的值时,其他线程是否能够立即知道这个修改。

     volatile int number=0;

     这样就可以保证,一个线程更改了共享变量number的值,其他线程也能立即知道这个修改           

    2.不保证原子性:

    原子性:某个线程正在做某个具体业务的时候,不可以被打扰                                             

     volatile int number=0;

     同样用volatile修饰共享变量,然后用20个线程都对这个共享变量进行加一操作,理论上讲,最后number的值应该是20,但实际上最后答案并不是20,这说明valatile不保证原子性

    3.有序性  禁止指令重排 

    java在编译时和运行时会对代码进行优化,会导致程序最终的执行顺序不一定就是编写代码时的顺序

    指令重排是指在程序执行过程中, 为了性能考虑, 编译器和CPU可能会对指令重新排序

    volatile关键字可以禁止指令进行重排序优化

    在单线程环境中, 程序是按序依次执行的

    在多线程环境中, 程序的执行可能因为指令重排而出现乱序

    比如下面了两行代码,就可能重排成右边的顺序

    synchronzed和volatile的区别:

    synchronized 关键字和 volatile 关键字是两个互补的存在,而不是对立的存在!

    (1)volatile 关键字是线程同步的轻量级实现,所以 volatile性能肯定比synchronized关键字要好 。但是 volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块 。

    (2)volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。

    (3)volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的同步性

                                                                                                                                                                                                                     

  • 相关阅读:
    安卓玩机----展讯芯片机型解锁 读写分区工具 操作步骤解析
    如何从零开始系统的学习项目管理?
    【计算机网络】IP协议详解
    如何保证电子产品可靠性设计?PCB板可制造性设计需要引起广大工程师的注意!
    c++操作mysql(详解)
    WMI 监控
    双十一蓝牙耳机怎么挑选?2022公认音质最好的蓝牙耳机
    【JavaEE多线程】线程中断 interrupt()
    酒店售货机系统架构分析贴牌定制开发oem搭建源码
    logstash输出到es模式action实践
  • 原文地址:https://blog.csdn.net/weixin_47414034/article/details/128158950