concurrent-04(volatile关键字)

volatile保证内存可见性,禁止指令重排序(cpu的优化,保证结果一致的情况下对指令进行选择性执行),但同时,volatile不可保证操作的原子性

public class Volatile {

    //volatile 内存可见性,禁止重排序
    private /*volatile*/ boolean flag = true;

    private void run(){
        while(flag){

        }
    }

    public static void main(String...args){
        Volatile invoke = new Volatile();
        new Thread(invoke::run).start();

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        invoke.flag = false;
    }
}

上段代码运行时虚拟机不会被停止,因为线程运行时会将flag拷贝到自己的工作内存中进行操作,而在run方法中线程会不断地判断工作内存中flag的值,这时cpu处于忙碌状态,不会到主内存中将主线程修改过的flag值重新刷新到工作内存中,所以程序会一直运行。

如果使用volatile关键字,则保证了变量flag的可见性,当有线程修改了flag时,会通知其他的线程工作内存中的flag副本已过期,这样其他线程会去主内存中重新读取flag的值,这样程序就会停止。

而正是因为这样,所以volatile只保证了读取的值是可见的,但当有线程对flag进行写操作时,不能保证一致性,如果需要一致性,则需要进行上锁,即volatile是不能替代synchronized关键字的,只有当仅需要可见性而不需要原子性时可以使用volatile提高效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值