分析volatile关键字可以从这三个方面分析,什么是程序的原子性,什么是程序的可见性,什么是程序的有序性

什么是程序的原子性

以下语句那些是原子操作?

public class ThreadCounter implements Runnable {
private int count = 0;
@Override
public void run() {
++count;
// count++;
}
public static void main(String[] args) throws InterruptedException {
ThreadCounter thread = new ThreadCounter();
for(int i = 0; i< 10000; i++){
new Thread(thread).start();
}
Thread.sleep(1000);//确保线程执行完
System.out.println(thread.count);
}
}

演示结果:语句一和二是非原子操作,语句三和四是原子操作

执行指令:javap -s -c ThreadCounter
run方法的指令码(count++):
 
count++这行代码分成了4个指令来执行,在多线程的情况下会不一致。

解决方法:

public class ThreadCounter implements Runnable {
private int count = 0;
@Override
public void run() {
synchronized (this) {
++count;
// count++;
}
}
public static void main(String[] args) throws InterruptedException {
ThreadCounter thread = new ThreadCounter();
for(int i = 0; i< 10000; i++){
new Thread(thread).start();
}
Thread.sleep(1000);//确保线程执行完
System.out.println(thread.count);
}
}

什么是程序的可见性?

public class VolatileExample {
boolean v =false; private void write(){
v =true;
} private void read(){
while(!v){
}
System.out.println("程序结束!");
} public static void main(String[] args) throws InterruptedException {
final VolatileExample example = new VolatileExample();
Thread thread1 = new Thread(()->{example.read();});
thread1.start();
Thread.sleep(1000);
Thread thread2 = new Thread(()->{example.write();});
thread2.start();
}
}
演示结果:
    程序没有结束,read方法中的v没有因write方法的修改而退出循环!
解决方法:为变量v添加volatile关键字
public class VolatileExample {
volatile boolean v =false; private void write(){
v =true;
} private void read(){
while(!v){
}
System.out.println("程序结束!");
} public static void main(String[] args) throws InterruptedException {
final VolatileExample example = new VolatileExample();
Thread thread1 = new Thread(()->{example.read();});
thread1.start();
Thread.sleep(1000);
Thread thread2 = new Thread(()->{example.write();});
thread2.start();
}
}

什么是程序的有序性?

Volatile应用场景

 1. 状态标记量 

public class ThreadTest {
private volatile boolean isContinue = false; private class HandleThread extends Thread {
@Override
public void run() {
while (isContinue) {
// do something
}
};
}
}

2. double check

 

总结:

volatile在可见性和有序性可以起到作用,但是不能保证原子性,是一种弱同步。

synchronized可以保证原子性,可见性,一致性,是一种强同步。

 
 
 
 
 
 
 
 
 

Java多线程技术-Volatile关键字解析的更多相关文章

  1. Java并发编程 Volatile关键字解析

    volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...

  2. Java 并发:volatile 关键字解析

    摘要: 在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保 ...

  3. java并发系列(六)-----Java并发:volatile关键字解析

    在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保证可见性 ...

  4. Java多线程编程——volatile关键字

    (本篇主要内容摘自<Java多线程编程核心技术>) volatile关键字的主要作用是保证线程之间变量的可见性. package com.func; public class RunThr ...

  5. 【java多线程】volatile 关键字

    在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...

  6. Java多线程:volatile 关键字

    一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存 ...

  7. Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  8. (转)Java并发编程:volatile关键字解析

    转:http://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或 ...

  9. Java并发编程:volatile关键字解析(转载)

    转自https://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析   Java并发编程:volatile关键字解析 ...

随机推荐

  1. wpf绑定静态变量,模拟rem单位

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...

  2. JAVA通用工具类

    1.异常验证框架 框架1:com.google.common.base.Preconditions 框架2:org.apache.commons.lang.Validate 框架3:org.apach ...

  3. 类 Fabric 主机管理程序开发

    类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载4. 充分使用多线程或多进程5. 不同主 ...

  4. SqlServer Function

    set quoted_identifier on; set ansi_nulls on; go create function [dbo].[Get_StrArrayStrOfIndex] ( @st ...

  5. C语言比较好的风格梳理

    errno int err; tb = malloc(sizeof(struct xtracer_table)); if (!tb) { err = errno; fprintf(stderr, &q ...

  6. Python模块 os.walk

    Os.walk os.walk(top,topdown=True,onerror=None,followlinks=False) os.walk()是python中内置(built-in)的目录树生成 ...

  7. go 语言优势

    一:为什么用Go来做抽奖系统 1.Go  vs PHP/JAVA ①:高并发,Go协程优于PHP多进程,JAVA多线程模式 ②:高并发,编译后的二进制优于PHP解释型,JAVA虚拟机 3:高效网络模型 ...

  8. Huawei-R&S-网络工程师实验笔记20190609-VLAN划分综合(Access和Trunk端口)

    >Huawei-R&S-网络工程师实验笔记20190609-VLAN划分综合(Access和Trunk端口) >>实验开始,先上拓扑图参考: >>>实验目标 ...

  9. 【Codeforces 478C】Table Decorations

    [链接] 我是链接,点我呀:) [题意] 给你r,g,b三种颜色的气球 每张桌子要放3个气球 但是3个气球的颜色不能全都一样 (允许两个一样,或者全都不一样) 问你最多能装饰多少张桌子 [题解] 先把 ...

  10. noip模拟赛 伪神

    题目背景 一切就绪 但愿,这样就好 自那之后的五年—— 作为封印持续增大的结果,在我体内积蓄了庞大的光精灵的力量 在幻灯结界里觉醒过来的我,和从封印解放出的德米奥格,就如同字面意思所述的,获得了等同于 ...