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();
}
}
}

参考:

  1. 《Java并发编程:volatile关键字解析》:http://www.importnew.com/18126.html

  2. 《volatile的适用场景》:https://blog.csdn.net/vking_wang/article/details/9982709

  3. 《正确使用 Volatile 变量》:https://www.ibm.com/developerworks/cn/java/j-jtp06197.html


每天用心记录一点点。内容也许不重要,但习惯很重要!

Java Thread系列(六)volatile的更多相关文章

  1. Java Thread系列(四)线程通信

    Java Thread系列(四)线程通信 一.传统通信 public static void main(String[] args) { //volatile实现两个线程间数据可见性 private ...

  2. Java Thread系列(五)synchronized

    Java Thread系列(五)synchronized synchronized锁重入 关键字 synchronized 拥有锁重入的功能,也就是在使用 synchronized 时,当线程等到一个 ...

  3. Java Thread系列(三)线程安全

    Java Thread系列(三)线程安全 一.什么是线程安全 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. 线程安全来 ...

  4. Java Thread系列(二)线程状态

    Java Thread系列(二)线程状态 一.线程的五种状态 新建状态(New):新创建了一个线程对象,尚未启动. 就绪状态(Runnable):也叫可运行状态.线程对象创建后,其他线程调用了该对象的 ...

  5. Java Thread系列(一)线程创建

    Java Thread系列(一)线程创建 Java 中创建线程主要有三种方式:继承 Thread.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实 ...

  6. Java Thread系列(十)Future 模式

    Java Thread系列(十)Future 模式 Future 模式适合在处理很耗时的业务逻辑时进行使用,可以有效的减少系统的响应时间,提高系统的吞吐量. 一.Future 模式核心思想 如下的请求 ...

  7. Java Thread系列(九)Master-Worker模式

    Java Thread系列(九)Master-Worker模式 Master-Worker模式是常用的并行设计模式. 一.Master-Worker 模式核心思想 Master-Worker 系统由两 ...

  8. Java Thread系列(十)生产者消费者模式

    Java Thread系列(十)生产者消费者模式 生产者消费者问题(producer-consumer problem),是一个多线程同步问题的经典案例.该问题描述了两个共亨固定大小缓冲区的线程-即所 ...

  9. Java Thread系列(七)死锁

    Java Thread系列(七)死锁 当线程需要同时持有多个锁时,有可能产生死锁.考虑如下情形: 线程 A 当前持有互斥所锁 lock1,线程 B 当前持有互斥锁 lock2.接下来,当线程 A 仍然 ...

随机推荐

  1. Laravel学习之旅(一)

    路由 1.简介:简单的说就是将用户的请求转发给相应的程序进行处理: 2.作用:就是建立url和程序之间的映射. 3.请求类型:get.post.put.patch.delete 相比于thinkphp ...

  2. 《DSP using MATLAB》Problem 2.17

    1.代码: %% ------------------------------------------------------------------------ %% Output Info abo ...

  3. Java编程之Date的相关操作

    一:讲字符串的时间格式数据转换成时间对象 //将字符串的时间数据,转换成时间 String dateString="2007-12-12"; DateFormat date=new ...

  4. streamsets mongodb destinations 使用

    测试集成了directory(excel) 以及redis && field splitter 组件 pipeline flow docker-compose 配置 redis 服务& ...

  5. bzoj2004公交线路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 好美妙的矩阵乘. 思考: 0.在一个序列上.所以考虑dp. 1.p<=10,k& ...

  6. 基于Tomcat 的WEB Project存在的安全漏洞总结

    1 检查工具:Acunetix Web Vulnerability Scanner V9破解版 2 检查漏洞说明结果显示: 2.1 HTML Form Without CSRF Protection ...

  7. Android Studio使用JDBC远程连接mysql的注意事项(附示例)

    JDBC为java程序访问各种类型的关系型数据库提供了统一的接口,用户不必针对不同数据库写出不同的代码,但是使用JDBC必须得下载相应的驱动,比如我这里是要连接mysql,于是就到mysql官网去下载 ...

  8. ACM-Teleportation

    我的代码: #include <bits/stdc++.h> using namespace std; int main() { int a,b,x,y; cin>>a> ...

  9. Django 组件-分页器

    Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views here ...

  10. 学习笔记之C# 教程 | 菜鸟教程

    C# 教程 | 菜鸟教程 http://www.runoob.com/csharp/csharp-tutorial.html 菜鸟教程在线编辑器 http://www.runoob.com/try/r ...