Volatile

Volatile 关键字语义分析

  • volatile作用:让其他线程能够马上感知到某一线程多某个变量的修改
    (1)保证可见性
    对共享变量的修改,其他的线程马上能感知到
    不能保证原子性 读、写、(i++)
    (2)保证有序性
    重排序(编译阶段、指令优化阶段)
    输入程序的代码顺序并不是实际执行的顺序
    重排序后对单线程没有影响,对多线程有影响
    Volatile
    Happens-before
    volatile规则:
    对于volatile修饰的变量:
    (1)volatile之前的代码不能调整到他的后面
    (2)volatile之后的代码不能调整到他的前面(as if seria)

volatile的原理和实现机制(锁、轻量级)

  • 声明 Volatile int a ;
  • 汇编变为:Lock :a,遵循java对于CPU的开发规范 Lock是CPU开放的接口

使用场景

  • 代码需要顺序执行
  • 状态开关
public class StateOpenOrClose implements Runnable{

    private boolean switchKey = true;

    @Override
    public void run() {
        while(switchKey) {
            doWork();
        }
    }

    private void doWork() {
        System.out.println("Working");
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void shutdown() {
        switchKey = false;
    }


    public static void main(String[] args) {
        StateOpenOrClose stateOpenOrClose = new StateOpenOrClose();
        new Thread(stateOpenOrClose).start();

        new Thread(() ->{
            try {
                TimeUnit.SECONDS.sleep(5);
                stateOpenOrClose.shutdown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();


    }
}

  • 单例模式 双重锁
public class Singleton {
    private volatile static Singleton instance = null;

    public static Singleton getInstance() {
        if(instance == null) {
            synchronized (Singleton.class) {
                instance = new Singleton();
            }
        }
        return instance;
    }
}

  • volatile和synchronized区别
    • volatile只能修饰变量,synchronized可修饰方法,语句块,
    • synchronized 可保证原子性,volatile无法保证原子性
    • synchronized和volatile 都可保证可见性,但实现原理不同
      + volatile是对变量加了 Lock,synchronized使用的是monitorentry和monitorexit
    • volatile保证有序性,synchronized 可保证有序性,但代价太大,只有到达重量级锁才会保证有序性,因为退化为了串行执行(引起了阻塞)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值