java中的volatile关键字的作用

FAILED
白色玫瑰 程序猿

时间: 2023-05-22 阅读: 1 字数:2090

sjxi.cn
大家知道我们写的代码(尤其是多线程代码),由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。所以,在jdk1.5版本前,双重检查锁形式的单例模式是无法保证线程安全的。因此,下面的单例模式的代码,在JDK...

目录

    1. volatilejava中的一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。

    1、可见性。

    1. 说到内存可见性就必须要提到Java的内存模型,如下图所示:

    1. 可见性指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。顺便一提,工作内存和主内存可以近似理解为实际电脑中的高速缓存和主存,工作内存是线程独享的,主存是线程共享的。

    2、禁止指令重排序优化。

    1. 禁止指令重排序优化。大家知道我们写的代码(尤其是多线程代码),由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。编译器只保证程序执行结果与源代码相同,却不保证实际指令的顺序与源代码相同。这在单线程看起来没什么问题,然而一旦引入多线程,这种乱序就可能导致严重问题。volatile关键字就可以从语义上解决这个问题。
    2. 注意:禁止指令重排优化这条语义直到jdk1.5以后才能正确工作。此前的JDK中即使将变量声明为volatile也无法完全避免重排序所导致的问题。所以,在jdk1.5版本前,双重检查锁形式的单例模式是无法保证线程安全的。因此,下面的单例模式的代码,在JDK1.5之前是不能保证线程安全的。

    如对此有疑问,请联系qq1164688204。

    推荐Android开源项目

    项目功能介绍:RxJava2和Retrofit2项目,添加自动管理token功能,添加RxJava2生命周期管理,使用App架构设计是MVP模式和MVVM模式,同时使用组件化,部分代码使用Kotlin,此项目持续维护中。

    项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2

    原文地址:https://blog.csdn.net/NakajimaFN/article/details/125915757?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168475006116800192211331%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168475006116800192211331&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-28-125915757-null-null.142^v87^control_2,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96

    本文章网址:sjxi.cn/detil/d838be85fc9c43c480af20a7da93cf98

    打赏作者

    本站为非盈利网站,如果您喜欢这篇文章,欢迎支持我们继续运营!

    最新评论
    当前未登陆哦
    登陆后才可评论哦

      湘ICP备2021009447号

      ×

      (穷逼博主)在线接单

      QQ: 1164453243

      邮箱: abcdsjx@126.com

      前端项目代做
      前后端分离
      Python 爬虫脚本
      Java 后台开发
      各种脚本编写
      服务器搭建
      个人博客搭建
      Web 应用开发
      Chrome 插件编写
      Bug 修复