volatile的使用原则
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。
http://www.cnblogs.com/shijiaqi1066/p/4352802.html
volatile关键字
对于普通变量,在一个线程中更新变量值,则在其他线程中该变量的值并不会改变(存在时间差)。如果需要在其他线程中立即可见,需要使用 volatile 关键字。volatile 不能代替锁,一般认为volatile 比锁性能好(不绝对)。
例:两条线程,使用一个标志用于控制一条线程的循环,该标志由另一条线程进行操作。即一条读,一条写。若该标志没有被volatile修饰,则线程中循环永远无法结束。
public class TestMain {
static volatile boolean flag = true;
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
while (flag) {}
System.out.println(Thread.currentThread().getName() + "线程停止,死循环被打开");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = false;
System.out.println(Thread.currentThread().getName() + "修改flag为" + flag);
}
}).start();
Thread.sleep(Integer.MAX_VALUE);
}
}
例:(书上的例子)通过一个程序理解volatile。使用-server 的JVM 运行该程序,若没有使用volatile则程序中while永远无法停止。VolatileStopThread只会在自身线程内存中查看stop的值,永远不会更新。
public class VolatileStopThread extends Thread {
private volatile boolean stop = false;
public void stopMe() {
stop = true;
System.out.println("stop = " + stop);
}
public void run() {
int i = 0;
while (!stop) {
i++;
}
System.out.println("Stop thread");
}
public static void main(String args[]) throws InterruptedException {
VolatileStopThread t = new VolatileStopThread();
t.start();
Thread.sleep(1000);
t.stopMe();
Thread.sleep(1000);
}
}
volatile的使用原则
理解volatile关键字是熟悉Java并发编程的必经之路。如果要彻底理解volatile,首先需要理解Java内存模型。
volatile是java提供的一个轻量级的同步机制,用来对被修饰的变量进行同步。
使用volatile修饰的变量会对多个线程可见,也就是说任何线程都可以看到被volatile修饰的变量的最终值。
volatile并不能替代synchronized,因为volatile只提供了可见性,并没有提供互斥性;在多线程并发修改某个变量值时,依然会出现并发问题。
所以volatile最适合用的场景是一个线程修改被volatile修饰的变量,其他多个线程获取这个变量的值。
当多个线程并发修改某个变量值时,必须使用synchronized来进行互斥同步。
关于volatile的性能
若一个变量用volatile修饰,那么对该变量的每次读写,CPU都需要从主内存读取,性能肯定受到一定影响。
也就是说:volatile变量远离了CPU Cache,所以没那么高效。
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。
http://www.cnblogs.com/shijiaqi1066/p/4352802.html
volatile的使用原则的更多相关文章
- java面试总躲不过的并发(二):volatile原理 + happens-before原则
一.happens-before原则 同一个线程中的,前面的操作 happens-before 后续的操作.(即单线程内按代码顺序执行.但是,在不影响在单线程环境执行结果的前提下,编译器和处理器可以进 ...
- Java并发专题(三)深入理解volatile关键字
前言 上一章节简单介绍了线程安全以及最基础的保证线程安全的方法,建议大家手敲代码去体会.这一章会提到volatile关键字,虽然看起来很简单,但是想彻底搞清楚需要具备JMM.CPU缓存模型的知识.不要 ...
- volatile关键字到底做了什么?
话不多说,直接贴代码 class Singleton { private static volatile Singleton instance; private Singleton(){} //双重判 ...
- 多线程之 Volatile 变量 详解
Java 理论与实践: 正确使用 Volatile 变量 原文:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html 总结: volati ...
- 并发和多线程(七)--volatile
volatile: 相当于轻量级的synchronized,只能用来修饰变量,线程安全的三个特性通过volatile能实现其中的两个 原子性: 在之前的文章有说到,通过Atomic相关类.synchr ...
- 多线程与高并发(四)volatile关键字
上一篇学习了synchronized的关键字,synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁,而volatile是一个轻量级的同步机制. 前面学习了Java的内存模型,知 ...
- java 8大happen-before原则
1.单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作. 2.锁的happen-before原则:同一个锁的unlock操作happen-bef ...
- Java内存模型(二)volatile底层实现(CPU的缓存一致性协议MESI)
CPU的缓存一致性协议MESI 在多核CPU中,内存中的数据会在多个核心中存在数据副本,某一个核心发生修改操作,就产生了数据不一致的问题,而一致性协议正是用于保证多个CPU cache之间缓存共享数据 ...
- happen-before原则
单线程happen-before原则: 在同一个线程中,书写在前面的操作happen-before后面的操作. 锁的happen-before原则: 同一个锁的unlock ...
随机推荐
- MCI音乐播放
缘由: 在改正俄罗斯方块程序的功能的时候,想给这个程序增加一个背景音乐.本想用PlayWave来做的,但想到这个功能十分常用,那还不如封装一个自己的CMusic 类,以备不时之需.本来以为很容易的,可 ...
- jQuery插件之-Poshy Tip
jQuery插件Poshy Tip是一个强大的jQuery Tooltips插件,它有多种不同的外观.同时可以作为 Form Tooltips使用,并且可以自定义气泡出现的位置.在处理表单验证提示上能 ...
- C# asp.net 操作Word的前提配置和简单的方法
操作的前提: 1.要保证机器本身要安装OFFICE. 有时安装了Office,但是不能找到Microsoft Word 11.0(或者更高的版本) Object Library.那可能是因为在安装of ...
- Unity3d Physically Based Hair Shading in Unreal
---by wolf96 16/10/16
- mini2440触摸屏驱动分析
mini2440驱动分析系列之 ---------------------------------------Mini2440触摸屏程序分析 By JeefJiang July,8th,2009 这是 ...
- POJ1365 - Prime Land(质因数分解)
题目大意 给定一个数的质因子表达式,要求你计算机它的值,并减一,再对这个值进行质因数分解,输出表达式 题解 预处理一下,线性筛法筛下素数,然后求出值来之后再用筛选出的素数去分解....其实主要就是字符 ...
- 常用apt cli
常用的APT命令参数: apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get ...
- java 关于多态的一点总结
http://www.cnblogs.com/wenruo/p/5352683.html 一直不是很理解多态,今天看了两遍<think in java>第八章,试着总结一下. 多态的本质就 ...
- MyBatis Oracle批量更新
<update id="updateProductSerialNo" parameterType="java.util.List"> <for ...
- IOS学习笔记38--@class #import辨析 #include
tyle="margin:20px 0px 0px; line-height:26px; font-family:Arial"> #include 区分 #i ...