java volatile 修饰符

java volatile 修饰符小编参考了添加链接描述这篇博客,在此对博主进行感谢!volatile修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。新建MainDemopublicclassMainDemo{//privatestaticinta=0;privatestaticvolatileinta=0;pri

大家好,又见面了,我是你们的朋友全栈君。

小编参考了吃透Java并发:volatile是怎么保证可见性的这篇博客,在此对博主进行感谢!
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

  1. 新建 MainDemo

public class MainDemo { 
   

// private static int a = 0;
    private static volatile int a = 0;
    private static int number = 0;

    public static void main(String[] args)  throws Exception { 
   
        Thread t1 = new Thread(new Runnable() { 
   
            @Override
            public void run() { 
   
                while (a == 0) { 
   

                }
                System.out.println("T1得知a = 1");
            }
        });

        Thread t2 = new Thread(new Runnable() { 
   
            @Override
            public void run() { 
   
                try { 
   
                    Thread.sleep(1000);
                    a = 1;
                    System.out.println("T2修改a = 1");
                } catch (InterruptedException e) { 
   
                    e.printStackTrace();
                }
            }
        });
        t1.start();
        t2.start();
    }
}

总结: 从上面的 demo中可以看出,变量a是可见的。

  1. 非volatile 修饰变量a。修改之后是不可见的
  2. volatile修饰的变量a是可见的。

新建 Main


import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Main { 
   

    private static  int a = 0;
// private static volatile int a = 0;
    private static int number = 0;

    public static void main(String[] args)  throws Exception { 
   
        Thread t1 = new Thread(new Runnable() { 
   
            @Override
            public void run() { 
   
                while (a == 0) { 
   
// log.info("t1在运行"); // 非volatile 修饰的也可见
// System.out.println("println 打印 t1在运行"); // synchronized 非volatile 修饰的也可见
                    try { 
   
                        Thread.sleep(10);  // 非volatile 修饰的也可见
                    } catch (InterruptedException e) { 
   
                        e.printStackTrace();
                    }
// number++; // 非volatile不可见
                }
                System.out.println("T1得知a = 1");
            }
        });

        Thread t2 = new Thread(new Runnable() { 
   
            @Override
            public void run() { 
   
                try { 
   
                    Thread.sleep(1000);
                    a = 1;
                    System.out.println("T2修改a = 1");
                } catch (InterruptedException e) { 
   
                    e.printStackTrace();
                }
            }
        });
        t1.start();
        t2.start();
    }
}

注意以下情况:

  1. log.info(“t1在运行”); 在非volatile 修饰的变量a 也可见
  2. System.out.println(“println 打印 t1在运行”); 在非volatile 修饰的变量a 也可见,原因是这个方法内部加了锁
  3. synchronized
    try {

    Thread.sleep(10); // 非volatile 修饰的也可见
    } catch (InterruptedException e) {

    e.printStackTrace();
    }
    在非volatile 修饰的变量a 也可见, 原因是 线程休眠了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161282.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql中phpmyadmin安装教程_安装phpMyAdmin图文教程[通俗易懂]

    mysql中phpmyadmin安装教程_安装phpMyAdmin图文教程[通俗易懂]phpmyadmin的安装配置已经是老生常谈的话题了,网络上到处都可以找到相关的配置教程。但是,那些大多都是手动配置的,稍不留神,容易出错。因此站长今天在这里介绍的是,被很多phpmyadmin用户所忽略的phpmyadmin自带的安装程序,下面我们就开始一步一步来安装phpmyadmin。1、首先下载phpmyadmin3.4.11,这是目前最稳定无bug的版本,点击下载2、在你的web根目录新…

    2022年6月1日
    28
  • 遗传算法实例解析_遗传算法例子

    遗传算法实例解析_遗传算法例子遗传算法实例及MATLAB程序解析遗传算法GeneticAlgorithms,GA)是一种基于自然选择原理和自然遗传机制的搜索(寻优)算法,它是模拟自然界中的生命进化机制,在人工系统中实现特定目标的优化。遗传算法的实质是通过群体搜索技术,根据适者生存的原则逐代进化,最终得到最优解或准最优解。它必须做以下操作∶初始群体的产生、求每一个体的适应度、根据适者生存的原则选择优良个体、被选出的优良个体两两配对,通过随机交叉其染色体的基因并随机变异某些染色体的基因生成下一代群体,按此方法使群体逐代进化,直到满足进化

    2025年11月9日
    6
  • android常用布局详解「建议收藏」

    android常用布局详解「建议收藏」view和布局在一个Android应用程序中,用户界面通过View和ViewGroup对象构建。Android中有很多种View和ViewGroup,他们都继承自View类。View对象是Android平台上表示用户界面的基本单元。View的布局显示方式直接影响用户界面,View的布局方式是指一组View元素如何布局,准确的说是一个ViewGroup中包含的一些View怎么样布局。ViewGr…

    2022年6月2日
    33
  • java文件处理(3)——实现文件复制和文件移动「建议收藏」

    java文件处理(3)——实现文件复制和文件移动「建议收藏」任务要求:通过二进制流的操作方式把程序调整为可以实现对任何类型文件进行文件复制(而不是调用windows命令行的内部命令copy)。通过二进制流的操作方式把程序调整为可以实现对任何类型文件进行文件移动(而不是调用windows命令行的外部命令move)。1.介绍InputStream和OutputStreamInputStream和OutputStream是抽象类,是所有字节输入流和输…

    2022年6月22日
    28
  • 代理重加密-入门学习笔记(四)

    代理重加密-入门学习笔记(四)代理重加密(PRE)(重密码学!)原文:https://blog.csdn.net/Black_BearB/article/details/812280301、基本思想-流程结算在云计算中,云计算服务提供商作为代理人,用户A不能完全相信云计算服务提供商,因此需要将自己的数据在本地用自己的公钥加密后在云中存储,这样代理人无法得到数据的明文信息。当他要和用户B共享文件时,A根据自己的信…

    2025年10月12日
    1
  • 快手用户群体分析_抖音、快手竞品分析报告

    快手用户群体分析_抖音、快手竞品分析报告一、产品初步体验介绍体验环境:RedmiNote5A体验时间:2018.7体验人:Cinnamon抖音快手抖音的logo以暗黑色为底,一个大大的亮白立体音符占据中央,强调了抖音重点在于结合音乐,给人的第一感觉就是炫酷,符合年轻人的审美。快手的logo以黄色为主,是一个立体的摄像机,体现了快手重点在于记录。应用首页抖音的底部button遵循传统的排版:刷新-附近/推荐(首页)、关注、拍摄、消息和我…

    2022年5月10日
    89

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号