并发编程处理实战篇3:volatile关键字解析

一.深入剖析volatile关键字

 

1.volatile关键字的两层语义

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

  1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

  2)禁止进行指令重排序。

  先看一段代码,假如线程1先执行,线程2后执行:

//线程1
boolean stop = false;
while(!stop){
    doSomething();
}
 
//线程2
stop = true;

 

 这段代码是很典型的一段代码,很多人在中断线程时可能都会采用这种标记办法。但是事实上,这段代码会完全运行正确么?即一定会将线程中断么?不一定,也许在大多数时候,这个代码能够把线程中断,但是也有可能会导致无法中断线程(虽然这个可能性很小,但是只要一旦发生这种情况就会造成死循环了)。

  下面解释一下这段代码为何有可能导致无法中断线程。在前面已经解释过,每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。

  那么当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。

  但是用volatile修饰之后就变得不一样了:

  第一:使用volatile关键字会强制将修改的值立即写入


http://www.niftyadmin.cn/n/1554998.html

相关文章

python编程怎么做游戏_Python编程代码:碰碰车游戏制作

# -*- encoding:utf-8 -*- import pygame import sys from pygame.locals import * from random import choice,randint pygame.init() # 定义常量 WIDTH 700 HEIGHT 150 SCREENSIZE (WIDTH,HEIGHT) TITLE "Car Game" SCOREFILEPATH highscore.txt ICON pygame…

idea中文件编码方式_详解Intellij IDEA中.properties文件中文显示乱码问题的解决

首先,你可能会见到如下提示:File encoding is disabled because .properties file (see Settings|Editor|File Encodings|Properties Files)具体如下图。没截全图,太大了,只截取了提示部分。在这之前,我一直以为&#…

并发编程处理实战篇4:线程状态转换说明

线程在一定条件下,状态会发生变化, 线程一共有以下几种状态: 1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可…

java random产生随机数_随机数类Random

Java实用工具类库中的类java.util.Random提供了产生各种类型随机数的方法。它可以产生int、long、float、double以及Goussian等类型的随机数。这也是它与java.lang.Math中的方法Random()最大的不同之处,后者只产生double型的随机数。  类Random中的方法十分简单&a…

并发编程处理实战篇5:线程操作wait和notify

线程进入运行状态之后,可以根据条件触发转为“等待阻塞”: 运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒, 如下代码: 1、定义两…

css改变伪元素color_【CSS】角标(伪元素)

微信订阅号:Rabbit_svip利用伪元素( ::before 和 ::after )制作,这样可以不影响主元素,也不用依赖其他html元素。利用border的特性制作角标。border属性还有很多玩法:本节效果微信订阅号:Rabbit_svip.corner {position…

c++ string分割字符串split_【Java学习笔记】(二)字符串(多图)

正文之前字符串(String),是由零个或多个字符组成的有限序列。一般记为 s a1a2...an(0 ≤ n ≤ ∞)它是编程语言中表示文本的数据类型本文将会介绍:Java字符串基本概念字符串基本操作 正文Java字符串基本概…

并发编程处理实战篇6:多线程交替执行

场景: 由于业务需要多线程并发操作,并且多线程之间是有一定的依赖关系,比如A线程存储数据,B线程则解析数据,即B线程是需要在A 线程执行完之后才开始执行,同样A线程存储数据的也需要B线程对数据解析完成后才开始存储新的数据,因此A与B两个线程就形成了交替实现,当然具体…