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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 大数据平台建设方案(项目需求与技术方案)[通俗易懂]

    大数据平台建设方案(项目需求与技术方案)[通俗易懂]一、项目背景 “十三五”期间,随着我国现代信息技术的蓬勃发展,信息化建设模式发生根本性转变,一场以云计算、大数据、物联网、移动应用等技术为核心的“新IT”浪潮风起云涌,信息化应用进入一个“新常态”。***(某政府部门)为积极应对“互联网+”和大数据时代的机遇和挑战,适应全省经济社会发展与改革要求,大数据平台应运而生。在这里我还是要推荐下我自己建的大数据学习交流qq裙: 957205…

    2022年4月30日
  • 原生js数组排序

    原生js数组排序原生js数组排序js排序以正序为例(即由小到大)vararr=[0,2,1,4,3,9,6,5,7,8];//未排序的数组varsortArr=null;//排序后得到的数组1sort排序sortArr=arr.sort(function(a,b){ returna-b})sort是es3增加的数组方法,大家可以放心使用(支持到ie…

    2022年6月12日
  • WebRTC中Fec实现「建议收藏」

    WebRTC中Fec实现「建议收藏」FEC报文构建、FEC掩码构造和丢失数据包恢复ForwardErrorCorrection::EncodeFec()主要:如2.2.1中所介绍的,随机丢包和突发丢包下fec组包模式不同,所以webrtc准备了两张mask表kFecMaskRandom(随机丢包),kFecMaskBursty(突发丢包)去生成mask,调用internal::GeneratePacketMasks()去生成mask 根据mask和packet,调用GenerateFecPayloads()生成fec包

    2022年8月11日
  • RSA加密算法c++实现

    RSA加密算法c++实现RSA加密算法c++实现 先码个代码:/*************************************************************************>FileName:RSA.cpp>Author:YB>E-mail:134…

    2022年5月21日
  • springboot整合mybatis(配置模式+注解模式)

    springboot整合mybatis(配置模式+注解模式)个人小总结

    2022年6月24日
  • 用户自定义类加载器下载_spring类加载器顺序

    用户自定义类加载器下载_spring类加载器顺序在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。为什么要自定义类加载器?隔离加载类 修改类加载的方式 扩展加载源 防止源码泄漏用户自定义类加载器实现步骤:开发人员可以通过继承抽象类ava.1ang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求 在JDK1.2之前,在自定义类加载器时,总会去继承ClassLoader类并重写1oadClass()方法,从而实现自定义的类加载类

    2022年9月3日

发表回复

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

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