Java Thread系列(六)volatile
Java Thread系列(六)volatile
volatile 关键字具备可见性,不具备原子性。主要作用是使变量在多个线程间可见。但不具备原子性(同步性),可以算一个轻量级的 synchronized ,性能要比 synchronized 强很多,不会造成阻塞。
一、volatile 可见性
public class VolatileThread extends Thread {
//volatile修辞的变量,变量发生变化时会强制性从主线程栈中读取该变量
private volatile boolean isRuning = true;
public void setIsRuning(boolean isRuning) {
this.isRuning = isRuning;
System.out.println("变量isRuning设置成功");
}
public void run () {
//主线程调制的变量isRuning生效,程序退出while语句
while (isRuning) {
// do ...
}
}
public static void main(String[] args) throws InterruptedException {
VolatileThread vt = new VolatileThread();
vt.start();
Thread.sleep(1000);
//主线程调制的变量isRuning在线程vt中生效,即实现了可见性
vt.setIsRuning(false);
}
}
二、volatile 非原子性
要想保证原子性,可以用 synchronized 修辞,或使用 AtomicInteger 类
import java.util.concurrent.atomic.AtomicInteger;
public class VolatileNotAtomic extends Thread {
private static volatile int count;
//private static AtomicInteger count = new AtomicInteger(0);
public static void addCount() {
for (int i = 0; i < 1000; i++) {
count++;
//count.incrementAndGet();
}
System.out.println(count);
//使用volatile关键字,最后的结果不是1000*10
//要想保证原子性,可以使用AtomicInteger类,只保证最后的结果正确,中间可能有误
}
public void run () {
addCount();
}
public static void main(String[] args) throws InterruptedException {
VolatileNotAtomic[] vna = new VolatileNotAtomic[10];
for (int i = 0; i < 10; i++) {
vna[i] = new VolatileNotAtomic();
}
for (int i = 0; i < vna.length ; i++) {
vna[i].start();
}
}
}
参考:
《Java并发编程:volatile关键字解析》:http://www.importnew.com/18126.html
《volatile的适用场景》:https://blog.csdn.net/vking_wang/article/details/9982709
《正确使用 Volatile 变量》:https://www.ibm.com/developerworks/cn/java/j-jtp06197.html
每天用心记录一点点。内容也许不重要,但习惯很重要!
Java Thread系列(六)volatile的更多相关文章
- Java Thread系列(四)线程通信
Java Thread系列(四)线程通信 一.传统通信 public static void main(String[] args) { //volatile实现两个线程间数据可见性 private ...
- Java Thread系列(五)synchronized
Java Thread系列(五)synchronized synchronized锁重入 关键字 synchronized 拥有锁重入的功能,也就是在使用 synchronized 时,当线程等到一个 ...
- Java Thread系列(三)线程安全
Java Thread系列(三)线程安全 一.什么是线程安全 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. 线程安全来 ...
- Java Thread系列(二)线程状态
Java Thread系列(二)线程状态 一.线程的五种状态 新建状态(New):新创建了一个线程对象,尚未启动. 就绪状态(Runnable):也叫可运行状态.线程对象创建后,其他线程调用了该对象的 ...
- Java Thread系列(一)线程创建
Java Thread系列(一)线程创建 Java 中创建线程主要有三种方式:继承 Thread.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实 ...
- Java Thread系列(十)Future 模式
Java Thread系列(十)Future 模式 Future 模式适合在处理很耗时的业务逻辑时进行使用,可以有效的减少系统的响应时间,提高系统的吞吐量. 一.Future 模式核心思想 如下的请求 ...
- Java Thread系列(九)Master-Worker模式
Java Thread系列(九)Master-Worker模式 Master-Worker模式是常用的并行设计模式. 一.Master-Worker 模式核心思想 Master-Worker 系统由两 ...
- Java Thread系列(十)生产者消费者模式
Java Thread系列(十)生产者消费者模式 生产者消费者问题(producer-consumer problem),是一个多线程同步问题的经典案例.该问题描述了两个共亨固定大小缓冲区的线程-即所 ...
- Java Thread系列(七)死锁
Java Thread系列(七)死锁 当线程需要同时持有多个锁时,有可能产生死锁.考虑如下情形: 线程 A 当前持有互斥所锁 lock1,线程 B 当前持有互斥锁 lock2.接下来,当线程 A 仍然 ...
随机推荐
- iMac 10年
10年前,也就是1998年8月15号,Apple 推出了蓝色半透明的 iMac G3(指上市,发布时间为当年5月6号),当年销售200万台,从此开启了它的一个时代,人们一旦说起设计,那么 Apple ...
- Visual Studio2010 支持MVC4开发
最近的项目有一个维护的版本使用的是Visual Studio2010+MVC4开发的,记录一下软件的开发环境 ============================================= ...
- test20181019 B君的第三题
题意 B 君的第三题(urumqi) 题目描述 风雨如晦,鸡鸣不已. B 君最近在研究自己的学长都在做什么工作,每个学长属于一个公司. B 君会获得一些信息,比如x 和y 在相同公司,x 和y 在不同 ...
- 毕业了C++二叉树层次遍历
//代码经过测试,赋值粘贴即可用#include<iostream> #include<stdio.h> #include<stack> #include<q ...
- graphql-yoga 项目简单使用&&集成docker
graphql-yoga 是一个实现了grahql的框架,使用简单,便捷 具体源码参考github https://github.com/rongfengliang/graphql-yoga-do ...
- cocos2dx 3.0 +VS2013 环境搭建
1.需要javasdk,android sdk,ndk,python 2.各种环境变量配置如下: JAVA_HOME:C:\Program Files\Java\jdk1.7.0_67 Path:%J ...
- 为什么 Windows 10 无论怎么设置一分钟后就自动关屏幕?
为什么 Windows 10 无论怎么设置一分钟后就自动关屏幕? 在设置中设置了很多方法,但不管怎么设置就是不行,不到一分钟一定关屏幕. 开始以为是能源之星引起,查了相关资料说不是,那个能源之星标志只 ...
- 【转】linux sed命令详解
原文网址:http://www.iteye.com/topic/587673 1. Sed简介sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”( ...
- WebService返回json格式数据供苹果或者安卓程序调用
1.新建一个WebService. 2. /// <summary> /// DemoToJson 的摘要说明 /// </summary> [WebService(Names ...
- 【并发编程】Future和FutureTask以及CompletionService
Future接口 此接口主要用于: 代表异步计算的执行结果: 用于可取消的task:(比使用interrupt实现取消要方便 ) FutureTask类 FutureTask是Future的一个实现类 ...