Volatile用法、原理

1.volatile 作用

volatile用于修饰java的变量,不能保证原子性,所以当多个线程去更新的时候,最终结果不准确

1.可见性

一个线程变量的修改对另外的线程是可见的,每个线程都有属于自己的栈,volatile修饰的变量 需要使用,直接去主内存中获取最新的值放到栈中,更改后,会同步到主内存中去

package com.pgf.juc.volatileT;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Auther: pgf
 * @Date: 2020/3/4 0004
 * @Description: 轻量级同步手段,原子可见性
 * @ToDo:
 * @version: 1.0
 */
public class VolatileTest implements Runnable{

    private static volatile boolean flag = true;

    /*一个线程一直循环,除非检测到flag变为false*/

    @Override
    public void run() {
        while(flag){

        }
        System.out.println(Thread.currentThread().getName()+"===flag is:"+flag);
    }


    public static void main(String[] args) throws InterruptedException {
        new Thread(new VolatileTest()).start();
        Thread.sleep(100);
        flag = false;
        System.out.println(Thread.currentThread().getName()+"===flag is:"+flag);
    }

}

在这里插入图片描述

2.防止指令重排序

User user = new User()
1.分配对象的内存空间
2.初始化对象
3.设置引用指向分配的内存地址

其中2、3两步间会发生指令重排序,导致多线程时如果在初始化之前访问对象则会出现问题,单例模式的双重检测锁模式正是会存在这个问题。可以使用volatile来禁止指令重排序解决问题

发布了10 篇原创文章 · 获赞 0 · 访问量 190

猜你喜欢

转载自blog.csdn.net/u011042377/article/details/104658287
今日推荐