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 仍然 ...
随机推荐
- 汉诺塔(Hanoi)——小小算法
传送门: 袁咩咩的小小博客 汉诺(Hanoi)塔源于古印度,是非常著名的智力趣题,大意如下: 勃拉玛是古印度的一个开天辟地的神,其在一个庙宇中留下了三根金刚石的棒,第一 根上面套着64个大小不一的圆形 ...
- .NET IL指令速查表
名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...
- MyBatis_Study_004(动态代理)
源码:https://github.com/carryLess/mbtsstd-004 0.readme 基于前几篇:dao的实现类基本煤气到什么作用 仅仅是通过SQLSession的相应API定位到 ...
- lua 二进制函数使用
由于 Lua 脚本语言本身不支持对数字的二进制操作(例如 与,或,非 等操作),MUSHclient 为此提供了一套专门用于二进制操作的函数,它们都定义在一个"bit"表中,使用时 ...
- ambassador 学习四 grpc 处理
实际上都是envoy 的功劳 基本环境安装参考相关文档即可 参考demo proto code syntax = "proto3"; option java_multiple_fi ...
- hibernate enum映射详解
hibernate enum映射详解 在这里介绍注解的形式,如果想要了解XML配置的方式,可以自行查找相关资料. 例如以下Entity @Entity @Table(name = "t_us ...
- 微信小程序详解——页面之间的跳转方式【路由】和参数传递
微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能.今天我们来研究小程序页面之间的跳转方式. 1.先导 在Andr ...
- VirtualBox的端口映射其实很好理解
还是和以前百度的另一个知识点一样,我真不明白网上那些人要做什么,明明很简单的事,干嘛非要讲的那么复杂,就是为了让人觉得你很高手?很厉害? 名称:随便起的,基于好记的原则,你的什么应用在使用这一条端口转 ...
- 【linux】U盘安装启动出现press the enter key to begin the installation process 就不动弹了
今天在物理机上安装centOS6.5 64bit 系统的时候,出现了U盘安装启动出现press the enter key to begin the installation process 就不动 ...
- Netty私有协议栈 读书笔记
1.数据结构定义 1)netty消息:NettyMessage package com.cherry.netty.demo.protocolstack.pojo; import com.cherry. ...