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关键字解析 ...
随机推荐
- 结果缓冲区 resbuf具体用法
struct resbuf *rb; rb=acutBulidlist(RTSTR,text(), rtpoint,,,,,) 创建圆用法. acdbEntGet 返回结果缓冲区 然后 rb-> ...
- 配置tfs2017的agent
tfs支持四种验证方式,分别是:PAT.Negotiate.Integrated.Alternate 我们使用Negotiate方式 首先,登录tfs服务器,设置iis的身份验证 添加一个Negot ...
- nginx配置https转发的一个例子
server { listen ; #https默认端口不是80,而是443 server_name www.test.com; ssl on; ssl_certificate cert/.pem; ...
- CAD动态绘制多段线(com接口)
主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE ...
- Centos7搭建ansible运维自动化工具
1)设置主机名和hosts文件 2)配置阿里云repo源 Wget -O /etc/yum.repos.d/aliyun.repo https://mirrors.aliyun.com/repo/Ce ...
- linux下root用户和tarena用户vimrc配置
设置vim自动缩进,行号,tab键宽度 如果是root超级用户,他的主目录是: /root ,打开文件vim的配置文件.vimrc 如果是tarena用户,他的主目录是:/home/tarena 打开 ...
- 《零压力学Python》 之 第一章知识点归纳
第一章(初识Python)知识点归纳 Python是从ABC语言衍生而来的 ABC语言是Guido参与设计的一种教学语言,为非专业编程人员所开发的. Python是荷兰程序员 Guido Van Ro ...
- Java基础之构造方法及其应用
构造方法是一种特殊的方法,它是一个与类同名且无返回值类型(连void也不能有)的方法. 对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化. 当类实例化一个对象时会自动调用构造方法.构造方 ...
- 2.1.6、SparkEnv中创建ShuffleManager
ShuffleManager负责管理本地以及远程的block数据的shuffle操作. ShffuleManager的创建是在SparkEnv中. // Let the user specify sh ...
- PowerDesigner16.5 使用遇到的问题
目录 1.PowerDesigner 菜单栏中没有 Datebase 2.PowerDesigner连接远程mysql数据库连接不上 3.怎样去掉窗口中的黑色网格线 4.设置默认"不为空&q ...