voliate理解

voliate理解voliatevoliate定义java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM…

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

voliate

 voliate定义

java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM底层volatile是采用“内存屏障”来实现的。

即一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

(1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。保证可见性、不保证原子性。
(2)禁止进行指令重排序

使用volatile关键字的场景

一般使用voliate必须具备如下条件:

(1)对变量的写操作不依赖于当前值

(2)变量中没有包含影响外部的其他变量

第一种就是适合单例模式来修饰单例对象

public class Signle {
    private static volatile Signle SIGNLE;

    private Signle() {
    }

    public static Signle getInstance0() {
        return SingleLazy.SIGNLE;
    }

    public static Signle getInstance() {
        if (null == SIGNLE) {
            synchronized (Signle.class) {
                if (null == SIGNLE) {
                    SIGNLE = new Signle();
                }
            }
        }
        return SIGNLE;
    }
第二种情况就是该变量是全局的属性,如果变化,会导致全局所有的线程都作出相应的操作。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • Windows server 80端口被占用怎么办_sqlserver基本介绍

    Windows server 80端口被占用怎么办_sqlserver基本介绍安装sqlserver导致80端口被占用解决方法系统占用的端口一般都是微软官方的产品占用的。所以这个时候主要考虑到几个服务:SQLServer导致。其中很有可能是SQLServerReportingServices(MSSQLSERVER),它是SQLServer的日志系统。IIS服务。如果你电脑安装了这个,很有可能它在运行着,那么它就占用着80端口当然如果都不…

    2025年7月1日
    4
  • Matlab矩阵复制扩充

    考虑这个问题:定义一个简单的行向量a    如何复制10行呢?即:    同理,对于一个列向量,如何复制10列呢?  关键函数1:repmat(A,m,n):将向量/矩阵在垂直方向复制m次,在水平方向复制n次。      再举一个例子,对于a=[12;34]:         垂直方向复制3次,水平方向复制2次,

    2022年4月8日
    61
  • 生物识别指纹_生物指纹识别技术

    生物识别指纹_生物指纹识别技术锁屏要使用指纹解锁,首先要注册指纹服务,我看过的一些大厂项目中,实际上是在KeyguardUpdate.java类中发起注册的,一般是根据当前状态,是不是已经处于上锁状态(侧边指纹机器,是不等上锁即进行指纹服务注册,屏下指纹需要等上锁后,才发起指纹服务注册)。………………………

    2022年8月10日
    12
  • centos7配置虚拟ip_centos临时设置ip

    centos7配置虚拟ip_centos临时设置ip环境概览master:192.168.46.26slave1:192.168.46.27测试机:192.168.46.22(用于ping机器)安装keepalivedyuminstall-ykeepalived修改masterkeepalived.conf配置文件vim/etc/keepalived/keepalived.confinterface修改为自己的网卡(使用ipaddr查看)priority修改其参数为188设置为主节点virtual_ipadd

    2022年10月11日
    3
  • 使opensuse12.1实现一拖二(拖机)的双人使用系统(下)

    使opensuse12.1实现一拖二(拖机)的双人使用系统(下)

    2021年8月19日
    59
  • uni-app的unipush实现通知栏推送服务全过程「建议收藏」

    uni-app的unipush实现通知栏推送服务全过程「建议收藏」背景说明文档这个事情官方应该提供出来,可惜官方觉得是多余的,免费的东西凭啥给你做好。于是我在这里叙述一下实现消息通知推送的步骤。uni-app官方文档入口https://uniapp.dcloud.io/api/plugins/pushuniPush官方使用指南https://ask.dcloud.net.cn/article/35622推送H5+API接口:https://www….

    2022年6月2日
    997

发表回复

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

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