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


相关推荐

  • C语言——冒泡排序[通俗易懂]

    C语言——冒泡排序[通俗易懂]冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。代码如下#include<stdio.h>voidBBsort(intarr[],intsize){ intj,i,tem; for(i=0;i..

    2025年8月9日
    2
  • 图的存储及遍历 深度遍历和广度遍历 C++代码实现

    写这个程序给我的感觉就是乱,思路不是很清晰,遍历的逻辑关系还掌握的不是很熟,只是大概知道是这么回事,但是让自己去写的话,可能就写不出来了!还是要加大对遍历的熟悉程度才行啊!PS:另外推荐一个让大家真

    2021年12月25日
    44
  • Centos7安装nginx1.8.0步骤

    Centos7安装nginx1.8.0步骤前言Nginx(enginex)是一个高性能的HTTP和反向代理web服务器nginx安装环境》nginx是C语言开发,建议在linux上运行,本教程使用Centos7作为安装环境。gcc安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,(一)安装gcc:yuminstallgcc-c++PCREPCRE(PerlCompatibleRegularExpressions)是一个Perl库,包括perl兼容的正则表达式库。ng

    2022年6月6日
    69
  • html中三角向下符号,使用css实现三角符号效果[通俗易懂]

    html中三角向下符号,使用css实现三角符号效果[通俗易懂]关于使用css制作三角符号,网上有很多的例子了,在这里只是为了详细的向各位解释一下三角符号的原理下图,是一个长宽为100px,边框宽度为100px的一个元素,由此可见,在css中上下左右的边框相交处并不是一个直线,所以,可以根据此属性进行编写三角符号那么如何使用css的该属性来实现三角符号的效果呢,代码如下:html代码css代码div:after{position:absolute;width…

    2025年5月28日
    4
  • 高数两个重要极限公式_高数中两个重要公式

    高数两个重要极限公式_高数中两个重要公式(提示说明:其实下面的这些例题都可以直接使用“等价无穷小“”来做)凑成第一个特别重要极限的形式,之后再做处理。把用正弦的格式来代替正切把反三角函数转换成三角函数在做极限题,余弦一般看看是不是一个有界函数。凑成第二个重要极限形式,之后再做处理极限函数是分数形式,且分子与分母很相似,处理成(1+□)的形式,未知数趋向于无穷小或无穷大。待求极限函数有指数的时候,可以往…

    2022年5月3日
    68
  • c# mysql executenonquery_c#数据四种执行方法(ExecuteNonQuery)

    c# mysql executenonquery_c#数据四种执行方法(ExecuteNonQuery)1.使用ExecuteReader()操作数据库2.使用ExecuteNonQuery()操作数据库3.使用ExecuteScalar()操作数据库4.使用DataSet数据集插入记录,更新数据一、使用ExecuteReader()操作数据库,执行查询操作的非常好的方法。ExecuteReader比DataSet而言,DataReader具有较快的访问能力,并且能够使用较少的服务器资源。DataR…

    2025年10月27日
    4

发表回复

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

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