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关键字解析 ...
随机推荐
- Address space layout randomization
Address space layout randomization (ASLR) is a computer security technique involved in preventing ex ...
- 配置git使用ssh方式克隆gitlab的代码
配置ssh key https://www.cnblogs.com/hafiz/p/8146324.html 配置host https://www.cnblogs.com/kaerxifa/p/109 ...
- php第二十一节课
AJAX <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- 【JavaScript进阶】深入理解JavaScript中ES6的Promise的作用并实现一个自己的Promise
1.Promise的基本使用 // 需求分析: 封装一个方法用于读取文件路径,返回文件内容 const fs = require('fs'); const path = require('path') ...
- LOJ——#6277. 数列分块入门 1
~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法——分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...
- 18/10/19 周五欢乐赛题解(c++版)
注意本题解并没有去追求最优解,只是用比较暴力的方法求解.D题听说要改说明不是位数30位,目前除了D题可能有问题之外其他代码已经全部正确. A.查找字串 用string BF(暴力求解即可) 代码 #i ...
- webstorm汉化后乱码现象解决
本人之前使用的编辑器是sublime,今天换成webstrom,汉化时出现乱码现象,一开始我以为是没安装完整所以重装了好几遍,后来百度后才知道是webstrom字体类型的问题,具体解决方法如图,点击最 ...
- PAT 1097. Deduplication on a Linked List (链表)
Given a singly linked list L with integer keys, you are supposed to remove the nodes with duplicated ...
- Java 下实现Cache
最近在做Spring的项目,想做一个缓存,访问数据库,定期来做数据更新 要实现两个功能 可以通过http请求来立刻刷新缓存 缓存可以通过自己配置的时间间隔来定期刷新 通过Controller来做 因为 ...
- unigui的菜单树补习【2】treeview
Treeview用于显示按照树形结构进行组织的数据. Treeview控件中一个树形图由节点(TreeNode)和连接线组成.TtreeNode是TTreeview的基本组成单元. ...