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 仍然 ...
随机推荐
- Laravel学习之旅(一)
路由 1.简介:简单的说就是将用户的请求转发给相应的程序进行处理: 2.作用:就是建立url和程序之间的映射. 3.请求类型:get.post.put.patch.delete 相比于thinkphp ...
- 《DSP using MATLAB》Problem 2.17
1.代码: %% ------------------------------------------------------------------------ %% Output Info abo ...
- Java编程之Date的相关操作
一:讲字符串的时间格式数据转换成时间对象 //将字符串的时间数据,转换成时间 String dateString="2007-12-12"; DateFormat date=new ...
- streamsets mongodb destinations 使用
测试集成了directory(excel) 以及redis && field splitter 组件 pipeline flow docker-compose 配置 redis 服务& ...
- bzoj2004公交线路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 好美妙的矩阵乘. 思考: 0.在一个序列上.所以考虑dp. 1.p<=10,k& ...
- 基于Tomcat 的WEB Project存在的安全漏洞总结
1 检查工具:Acunetix Web Vulnerability Scanner V9破解版 2 检查漏洞说明结果显示: 2.1 HTML Form Without CSRF Protection ...
- Android Studio使用JDBC远程连接mysql的注意事项(附示例)
JDBC为java程序访问各种类型的关系型数据库提供了统一的接口,用户不必针对不同数据库写出不同的代码,但是使用JDBC必须得下载相应的驱动,比如我这里是要连接mysql,于是就到mysql官网去下载 ...
- ACM-Teleportation
我的代码: #include <bits/stdc++.h> using namespace std; int main() { int a,b,x,y; cin>>a> ...
- Django 组件-分页器
Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views here ...
- 学习笔记之C# 教程 | 菜鸟教程
C# 教程 | 菜鸟教程 http://www.runoob.com/csharp/csharp-tutorial.html 菜鸟教程在线编辑器 http://www.runoob.com/try/r ...