JAVA多线程基础篇 4、可见性、有序性与Volatile

面试官:volatile是如何保证可见性和有序性的? volatile保证可见性的原理 可见性问题 可见性问题指的是一个线程在访问一个共享变量的时候,其他线程对该共享变量的修改对于第一个线程来说是不可见的,下面通过一个例子可以发现可见性问题。 public class Visable { private static boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(() 阅读详情

1. 可见性问题和有序性问题

在多线程开发中,可见性问题和有序性问题需要依托volatile来保证。

可见性,一个线程对共享变量的修改,另外一个线程能够立刻看到。
首先需要了解一个概念,堆和栈。
程序在运行的过程中,数据放在堆中,线程内部的缓存数据会放在栈中。
在堆中的数据是公共的,而在线程的栈帧里的数据是缓存各自线程的。
因此,当A、B两个线程,无论谁更新了线程内的数据,都及时同步并告知其他线程重新刷新读取缓存。java使用volatile 修饰的变量,通过操作系统底层的锁总线(LOCK#)或者缓存一致性协议(MESI)实现可见性。

  • Lock 会对总线进行锁定,其它 CPU 对内存的读写请求都会被阻塞,直到锁释放。LOCK的开销比较大,锁总线期间其他 CPU 没法访问内存。于是引入了缓存一致性协议(MESI)来实现。
  • MESI 当一个缓存代表它所属的处理器去读写内存时,其它处理器都会得到通知,它们以此来使自己的缓存保持同步。 只要某个处理器写内存,其它处理器马上知道这块内存在它们的缓存段中已经失效。

有序性,即程序执行的顺序按照代码的先后顺序执行。
在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。

  • 编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
  • 指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
  • 内存系统的重排序。由于处理器使用缓存和读 / 写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

通过synchronized和Lock来保证有序性,synchronized和Lock保证每个时刻是有一个线程执行同步代码,相当于是让线程顺序执行同步代码,自然就保证了有序性。
通过使用volatile来保证有序性,对一个 volatile 域的写,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。

# 2. 可见性问题的实验

public class VolatileTest {
    private static boolean flag = true;
    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            while (flag) {
            }
            System.out.println("over");
        }).start();
    
        Thread.sleep(5);
    
        flag=false;
    }
}

此时,程序是不会有任何输出的,因为在更改flag为false后,线程栈帧内存储的变量没有被改变。

volatile3

2.1 volatile确保了可见性

如下程序,简单增加volatile修饰后可以达到效果。

public class VolatileTest {
    private volatile static boolean flag = true;
    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            while (flag) {

            }
            System.out.println("over");
        }).start();

        Thread.sleep(5);

        flag=false;
    }
}

运行结果:
volatile1

注意:volatile一般修饰基础类型,尽量不要去修饰引用类型。

3. 一个指令乱序的实验

如果没有乱序执行,则只可能x和y 分别同时为1 ,或者是1 0 组合 或者是 0 1 组合。

一定不能出现x和y同时为0.

public class VolatileTest2 {
        static int a;
        static int b;
        static int y;
        static int x;
        public static void main(String[] args) throws InterruptedException {
            int count = 0;
            while (true) {
                a = 0;
                b = 0;
                y = 0;
                x = 0;
                Thread t1 = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        a = 1;
                        x = b;
                    }
                });
                Thread t2 = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        b = 1;
                        y = a;
                    }
                });

                t1.start();
                t2.start();
                t1.join();
                t2.join();
                count++;
                if (x == 0 && y == 0) {
                    System.out.println("第"+count+"次");
                    break;
                }
            }
        }
}    

运行结果显示,出现了x和y同时为0。说明程序命令a = 1;x = b;或b = 1;y = a发生了乱序执行。

第183383次 (0,0)

Process finished with exit code 0

总结

java使用volatile 修饰的变量,通过操作系统底层的锁总线(LOCK#)或者缓存一致性协议(MESI)实现可见性。

java对一个 volatile 域的写,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

线程安全的三大特性(原子性、可见性、有序性)、volatile关键字 volatile关键字介绍一:线程安全的三大特性1、原子性2、可见性3、有序性二:volatile关键字 一:线程安全的三大特性 1、原子性 原子性是指操作是不可分的。其表现在于对于共享变量的某些操作,应该是不可分的,必须连续完成。 比如 a++ 操作,实际上 JMM 会分 3 步来完成。 ①②③读取变量 xttblog 的值 xttblog 的值+1 将值赋予变量 xttblog 这三个操作中任何一个操作过程中,xttblog 的值被人篡改,那么都会出现我们不希望出现的结果。所以我们必须保证这是原子性的 阅读详情

相关推荐

老服务器焕新记:在Dell R730上折腾Nvidia K80显卡的完整记录(含Anaconda环境配置)

本文详细记录了在Dell R730服务器上为Nvidia K80计算卡安装驱动、配置CUDA及Anaconda环境的完整过程。文章重点解决了老旧硬件与CentOS 7系统的兼容性问题,提供了从BIOS设置、驱动版本精准匹配到Python机器学习环境搭建的实战指南,旨在帮助读者低成本挖掘旧服务器的GPU计算潜力。

weixin_29197835的博客 503

Java并发编程之可见性分析 volatile

例如,线程A和线程B,它们都是直接修改主内存中的共享变量,无论是线程A修改了共享变量,还是线程B修改了共享变量,则另一个线程从主内存中读取出来的变量值,一定是修改过的值,这就是线程的可见性。这些线程都是运行在同一个CPU上,操作的是同一个CPU的缓存,只要其中一个线程修改了共享变量的值,那另外的线程就一定能够访问到修改后的变量值。例如,上面的图中,由于CPU是多核的,线程A操作的是CPU-01上的缓存,线程B操作的是CPU-02上的缓存,此时,线程A对变量V的修改对线程B是不可见的,反之亦然。

m0_73311735的博客 1447

[语义分割]SPP、空洞卷积与ASPP总结

ASPP全称:Atrous Spatial Pyramid Pooling,中文可以理解为空洞空间卷积池化金字塔或者多孔空间金字塔池化。在这其中,要理解两个概念:一个是SPP,池化金字塔结构或者叫空间金字塔池化层,都是一个东西;另一个是Atrous,空洞卷积,两个加在一起就是ASPP。 首先说一下SPP:Spatial Pyramid Pooling。这个结构出自于论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Re

lipengfei0427的博客 2万+

Java 之 volatile 详解

volatile 可以看做是轻量级的 synchronized,它只保证了共享变量的可见性,是Java虚拟机提供的轻量级的同步机制。在线程 A 修改被 volatile 修饰的共享变量之后,线程 B 能够读取到正确的值。Java 在多线程中操作共享变量的过程中,会存在指令重排序与共享变量工作内存缓存的问题。volatile 一共有三大特性,保证可见性不保证原子性禁止指令重排。

流华追梦的专栏 8520

[VisionPro] CogPMAlignTool 工具详解

[VisionPro] [CogPMAlignTool] [模板匹配]

weixin_43163656的博客 1万+

SAP PP未清生产订单关闭物料退料、新工单发料批量处理

( werks = '1001' lgort = 'A004' lgobe = '组装-成品组装' )( werks = '1002' lgort = 'C006' lgobe = '组装-二车间' )( werks = '1002' lgort = 'C007' lgobe = '组装-二车间' )( werks = '1001' lgort = 'A007' lgobe = '组装-MS' )( werks = '1001' lgort = 'A008' lgobe = '组装-GW' )

dingqing86的专栏 1192

Java 三大并大特性-可见性介绍(结合代码、分析源码)

在并发编程中分析线程安全的问题时往往需要切入点,这其中就包含三条性质:原子性,有序性和可见性。JMM(Java内存模型)就是基于这三个特性展开的,前面的文章中我们已经分析了原子性,现在我们结合代码和字节码、以及jvm hotspot源码一起来看下可见性。

qq_25409421的博客 2232

Opencv实战:答题卡自动识别与评分系统(附完整代码解析)

本文详细介绍了如何使用OpenCV实现答题卡自动识别与评分系统,包含完整的代码解析。通过图像预处理、边缘检测、透视变换和答案识别等关键技术,系统能够快速准确地完成阅卷工作,适用于学校考试、资格认证等多种场景,大幅提升工作效率。

weixin_33737134的博客 415

Java volatile关键字:你真的懂了吗?

可见性问题是指一个线程对共享变量的修改可能不被其他线程立即感知。volatile 通过强制线程从主内存中读取变量的值,而不是从线程的本地缓存中,来解决可见性问题。这确保了一个线程对 volatile 变量的修改对其他线程是可见的。

Hanko的专栏 1764

新手友好!C#上位机调用YOLO实现设备异常检测(详细步骤,附踩坑指南)

C#上位机调用YOLO实现设备异常检测,核心是把“工控交互”和“AI检测”的优势结合起来,新手不用追求一步到位,先跑通基础流程,再逐步优化性能和功能。我当初也是从踩坑中过来的,只要把核心链路和细节摸透,其实门槛并没有想象中高。如果你们在实操中遇到了具体问题(比如相机取流卡顿、模型推理报错),可以在评论区留言,后续我也可以针对性拆解具体模块的完整代码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 667

基于物联网技术设计的微型消防小车控制系统(STM32+ESP8266局域网)(181)

基于物联网技术的小微型消防车控制系统。通过远程控制功能,用户能够灵活操作消防车的行驶,方便快速抵达火灾现场。环境感知功能实时采集烟雾浓度、温湿度信息,为灭火决策提供科学依据。火源定位功能采用自动和手动两种模式,准确迅速地定位火源,并通过报警提示用户。灭火功能则根据火源定位结果,自动或手动启动干粉灭火器进行高效灭火。这些功能的结合实现了对小型火灾的全面应对,提升了消防效率与安全性,减少了火灾带来的损失。通过本项目的设计与实现,为消防领域提供了一种创新且实用的解决方案。

3081

解决Java并发可见性问题,Volatile闪亮登场

场景引入,问题初现 很多同学出去面试,都会被问到一个常见的问题:说说你对volatile的理解? 不少初出茅庐的同学可能会有点措手不及,因为可能就是之前没关注过这个。但是网上百度一下呢,不少文章写的很好,但是理论扎的太深,文字太多,图太少,让人有点难以理解。 基于上述痛点,这篇文章尝试站在年轻同学的角度,用最简单的大白话,加上多张图给大家说一下,volatile到底是什么? 当然本文不会把理论扎的太深,因为一下子扎深了文字太多,很多同学还是会不好理解。 本文仅仅是定位在用大白话的语言将volati

java_beautiful的博客 345

使用GitLab限制开发者使用CI/CD的权限,三种方案

使用三种方案来限制开发人员的CI/CD权限。

知无涯 5097

volatile是如何保证可见性和有序性的

volatile保证可见性的原理 可见性问题 可见性问题指的是一个线程在访问一个共享变量的时候,其他线程对该共享变量的修改对于第一个线程来说是不可见的,下面通过一个例子可以发现可见性问题。 public class Visable { private static boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thre.

weixin_37990128的博客 4229

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

volatile如何保证可见性和有序性

volatile原理

bfj11的博客 7201

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

什么是 Java 中的原子性、可见性和有序性?

什么是 Java 中的原子性、可见性和有序性?原子性、可见性、有序性是 Java 并发编程的三大核心特性,任何并发 bug 基本都能归到这三类里面。

我哎GIS博客 3493

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java——原子性,可见性,有序性

1. 原子性 原子性:即一个操作或者多个操作,要么全部执行,并且执行的过程不会被任何因素打断,要么就都不执行。 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。 上面一句话虽然看起来简单,但是理解起来并不是那么容易。看下面一个例子: x = 10; //语句1 y = x; //语句2 x++; //语句3 x = x + 1; //语句4 注意:其实只有语句1是原子性操作,其他三个语句都不是原子性操作。 语句1是直接将数值10

Yawn 7199

并发volatile关键字如何保证可见性和有序性及底层实现原理

volatile用法 首先我们先了解一下volatile关键字的用法 ,volatile被喻为轻量级的"synchronized",它只是一个变量修饰符,只能用来修饰变量不能修饰方法和代码块。 经典的用法:双重校验锁实现单例 public class Singleton { private volatile static Singleton singleton; pri...

lc13571525583的博客 1万+

java中volatile关键字保证可见性有序性

我们知道java并发编程主要会有可见性,原子性,有序性几个问题。 volatile可以保证可见性和有序性,但是无法保证原子性。 有序性:编译器会根据自认为的排序对代码进行指令重排,指令重排不会对单线程造成影响,但是可能会导致多线程时候运行错误。 可见性:可行性是指对线程的操作对其他线程可见。 volatile关键字可以禁止指令重排,所以可以保证了有序性。有序性也通常是指的happen-before原则。 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作 锁定规则

xby7437的博客 1万+

Java多线程的可见性与有序性

多线程的可见性 一个线程对共享变量值的修改,能够及时的被其他线程看到。 共享变量 如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。 Java内存模型 JMM(Java Memory Model,简称JMM)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。它遵循四个原则: 所...

全菜工程师小辉的博客 6423

使用volatile解决多线程中的可见性和有序性

happens-before规定了对共享变量的写操作对其他线程的读操作可见,它是可见性和有序性的一套规则总结,跑开以下happens-before规则,JMM并不能保证一个线程对共享变量的写,对于其他线程对该共享变量的读可见。注意:synchronized里代码块的指令仍然是可以被重排序的,volatile才能阻止重排序,但是如果共享变量是完全被synchronized保护的,那么这个共享变量在使用的过程中是不会有原子性和可见性以及有序性问题的。

weixin_53216033的博客 1404

volatile到底有什么用?可见性、有序性与使用场景

午饭时,南北绿豆问:“你们知道单例模式的双重检查锁吗?不加volatile会死人的。哈吉米:“知道啊,synchronized加两层检查,防止多次创建。南北绿豆:“那为什么instance要加volatile?哈吉米:“呃…不知道。南北绿豆开始讲课:“因为指令重排序。// 原始代码int a = 1;// 语句1int b = 2;// 语句2// 语句3// CPU可能重排成int b = 2;// 语句2先执行int a = 1;// 语句1后执行// 语句3单线程没问题(结果不变),

比较是偷走幸福的小偷 3914

volatile,synchronized可见性,有序性,原子性代码证明(基础硬核)

目录 0.简介 1.可见性 1.1 不可见性 1.2 volatile可见性 1.3 synchronized可见性 2.原子性 2.1 原子性 2.2 volatile 非原子性 2.3 synchronized 原子性 3.有序性 3.1 有序性 3.2 volatile有序性 3.3 synchronized有序性 4.程序员学习方法心得 5.总结 0.简介 前一篇文章《Synchronized用法原理和锁优化升级过程》从面试角度详细分析了synchronized关键

duyabc的博客 7192

7.volatile怎么通过内存屏障保证可见性和有序性?

volatile是怎么保证可见性和有序性的?volatile怎么使用内存屏障?volatile居然都是通过内存屏障保证可见性和有序性!!!

chenzengnian123的博客 3366

volatile保证原子性、可见性、有序性的验证

volatile保证原子性、可见性、有序性的原理。

aaaPostcard的博客 1937

Java多线程中提到的原子性和可见性、有序性

原子性 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行。如果一个操作时原子性的,那么多线程并发的情况下,就不会出现变量被修改的情况比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安

jaryle的专栏 1万+
上一篇: JAVA多线程基础篇 2、如何创建线程
下一篇: JAVA多线程番外篇 1、单例模式与Volatile
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值