Java多线程技术-Volatile关键字解析
分析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);
}
}
演示结果:语句一和二是非原子操作,语句三和四是原子操作



解决方法:
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();
}
}
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应用场景
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关键字解析的更多相关文章
- Java并发编程 Volatile关键字解析
volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...
- Java 并发:volatile 关键字解析
摘要: 在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保 ...
- java并发系列(六)-----Java并发:volatile关键字解析
在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保证可见性 ...
- Java多线程编程——volatile关键字
(本篇主要内容摘自<Java多线程编程核心技术>) volatile关键字的主要作用是保证线程之间变量的可见性. package com.func; public class RunThr ...
- 【java多线程】volatile 关键字
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...
- Java多线程:volatile 关键字
一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存 ...
- Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
- (转)Java并发编程:volatile关键字解析
转:http://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或 ...
- Java并发编程:volatile关键字解析(转载)
转自https://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 Java并发编程:volatile关键字解析 ...
随机推荐
- 如何从源码启动和编译IoTSharp
IoTSharp 项目是一个开源物联网平台,数据库使用PostgreSQL , 后端使用 Asp.Net Core 2.2 ,前端使用 vue-element-admin , 下面我们介绍如何启动项 ...
- java静态变量、实例变量和局部变
实例变量又称成员变量: 1⃣️成员变量定义在类中,在整个类中都可以被访问 2⃣️成员变量随着对象的建立而建立,随对象的消失而消失,存在于对象所在的对内存中 3⃣️成员变量有默认初始值 局部变量: 1⃣ ...
- 利用shell脚本去备份幸运28源码搭建下载所指定的数据库
#! /bin/bash幸运28源码搭建下载Q[115288oo99]logintool=/home/yx/server/mysql/mysql/bin/mysqldumptool=/home/yx/ ...
- LOJ 6145 Easy (动态点分治+线段树)
题目传送门 先建出来点分树,以每个点为根开线段树,维护点分子树内编号为$[l,r]$的儿子到根的距离最小值 每次查询$x$开始,沿着点分树向上跑,在每个点的线段树的$[l,r]$区间里都查一遍取$mi ...
- RabbitMQ在Ubuntu上的环境搭建
1.修改/etc/apt/sources.list文件 A:命令:vi /etc/apt/sources.list B:在最后一行加上:deb http://www.rabbitmq.com/debi ...
- Django的基础教程
学Django需要什么基础? 1. Django是 python 语言写的一个Web框架包,所以你得知道一些 Python 基础知识. 2. 其次你最好有一些做网站的经验,懂一些网页 HTML, CS ...
- PAT 1034. Head of a Gang
1034. Head of a Gang (30) One way that the police finds the head of a gang is to check people's phon ...
- GlobalSign 增强型(EV) SSL 证书
GlobalSign 增强型(EV) SSL 证书,属于最高验证级别的EV SSL,验证域名所有权,进行严格的企业真实身份验证,证书标识企业组织机构名称,强化信任度,浏览器地址栏变绿色.提供40位/5 ...
- [bzoj1468][poj1741]Tree[点分治]
可以说是点分治第一题,之前那道的点分治只是模模糊糊,做完这道题感觉清楚了很多,点分治可以理解为每次树的重心(这样会把数分为若干棵子树,子树大小为log级别),然后统计包含重心的整个子树的值减去各个子树 ...
- Fedora15下安装Android开发环境
Fedora15下安装Android开发环境需要以下步骤: 完整步骤. 1. 安装正确版本的JDK. 2. 安装Eclipse. 3. 安装ADT. 4. 安装Android SDK. 5. 安 ...