您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 2浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java多线程 volatile适用的场景: 纯赋值的操作

java持续实践 发布时间:2020-09-06 11:13:04 ,浏览量:2

文章目录
      • 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             
关注
打赏
1658054974
查看更多评论
0.0396s