文章目录
volatile 修饰布尔的标记位
- volatile 修饰布尔的标记位
- volatile 修饰布尔适用的场景
- volatile 修饰布尔的标记位不适用的场景
volatile 适用于 boolean flag 如果一个共享变量, 一直只被各个线程赋值, 而没有其他的操作, 那么就可以用volatile来代替synchronized 或者代替原子变量, 因为对布尔变量的赋值自身是有原子性的, 而volatile保证了可见性, 就满足了线程安全. 因为布尔值, 只是改成true或者false, 具有原子性, 而不是像 a++操作是非原子性的.
volatile 修饰布尔适用的场景如下的代码演示了 volatile 适用的场景. 关键是如下的方法setDone,只是直接把done 改成了true, 而没有像a++操作那样, 需要读取a之前的值 . 只是修改布尔值是原子性的. 因此适用.
package com.thread.jmm;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 类名称:UseVolatileInBoolean
* 类描述:volatile 适用于 Boolean变量的并发修改 赋值
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/9/6 10:41
* Version 1.0
*/
public class UseVolatileInBoolean implements Runnable {
volatile boolean done = false;
//原子类, 统计执行了多少次
AtomicInteger atomicInteger = new AtomicInteger();
public static void main(String[] args) throws InterruptedException {
UseVolatileInBoolean runnable = new UseVolatileInBoolean();
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();
//主线程等待子线程执行完毕
thread1.join();
thread2.join();
System.out.println(runnable.done);
System.out.println("运行次数 : "+runnable.atomicInteger.get());
}
@Override
public void run() {
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?