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


相关推荐

  • SpringBoot跨域设置(CORS)「建议收藏」

    SpringBoot跨域设置(CORS)「建议收藏」目录什么是跨域跨域资源共享(CORS)1.简单请求2.非简单请求SpringBoot设置CORS1.配置过滤器CorsFilter2.实现接口WebMvcConfigurer3.使用注解@CrossOrigin什么是跨域请求url的协议、域名、端口三者有任意一个不同即为跨域。跨域问题是因为浏览器的同源策略的限制而产生的。同源:请求url的协议、域名、端口三者都相同即为同源(同一个域)。同源策略:同源策略(Sameoriginpolicy)是一种约定,他是浏览器最核心也最基本的安全

    2022年6月18日
    23
  • vue单页应用和多页应用_多页面应用需要vuejs吗

    vue单页应用和多页应用_多页面应用需要vuejs吗进入一家新的公司,要开发移动端app项目,前端技术选型时前端组长选的是vue的多页面开发,当时很蒙,vue不是单页面开发吗?咋出来多页面的。接触之后才发现确实存在也挺简单的,省去了路由表的配置。那就给大家整体思路分析一波吧。不足之处还请包涵!单页面开发我就不多说了,主要讲多页面的开发模式与最终效果,网上一搜单页面会有好多文章博客,但是搜多页面的就很少了,比如下面这个就是列了一下两种开发模式的优缺点。首先多页开发,肯定是一个页面就是一个单独文件,每个文件也有自己的.vue.js和comp.

    2022年10月13日
    0
  • 成员函数

    成员函数在C++中,允许在结构体中定义函数,该函数称为“成员函数”。描述形式如下:struct结构名{数据成员成员函数};例题:身高问题输入n个学生的信息,每个学生的信息包括姓名、身高、学号。变

    2022年7月3日
    26
  • 【MongoDB数据库】怎样安装、配置MongoDB

    【MongoDB数据库】怎样安装、配置MongoDB

    2022年1月31日
    46
  • html页面导出为pdf(jsPDF、iText、wkhtmltopdf)「建议收藏」

    html页面导出为pdf(jsPDF、iText、wkhtmltopdf)「建议收藏」html页面导出pdf,本来是一件很简单的事情,在浏览器直接打印(Mac快捷键为⌘+p;Windows快捷键为ctrl+p),就可以把页面另存为pdf文件,但对于要经常把页面导出为pdf的用户来说并不友好。调研了几种html导出pdf的实现方式,这里把要点记录下来分享下。调研对象优点缺点分页图片表格链接中文特殊字符、样式导出…

    2022年6月8日
    37
  • 【python实战】不让我复制?看我自制个带文字识别的截屏工具

    【python实战】不让我复制?看我自制个带文字识别的截屏工具人生苦短,我用python

    2022年5月7日
    33

发表回复

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

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