Volatile理解

1.volatile理解

volatile是一种轻量级的同步机制

  1. 保证可见性(主内存被修改,其他线程可见)
  2. 不保证原子性
  3. 禁止指令重排

JMM模型:Java Memory Mode,一般保证可见性,原子性,禁止指令重排。

  • volatile可见性的证明
import java.util.concurrent.TimeUnit;

class ShareData{
    volatile int num = 0;
    public void add60(){
        this.num = 60;
    }
}

//验证可见性
public class VolatileExample {
    public static void main(String[] args) {
        ShareData shareData = new ShareData();
        new Thread(() ->{
            System.out.println(Thread.currentThread().getName()+"\t come in");
            try{
                Thread.sleep(3);
            }
            catch (Exception e){
                e.printStackTrace();
            }
            shareData.add60();
            System.out.println(Thread.currentThread().getName()+"\t"+shareData.num);
        }).start();
        new Thread(() ->{
            while(shareData.num==0){

            }
            System.out.println(Thread.currentThread().getName()+"\t I know change");
        }).start();
    }
}

可以看到另外一个线程也能知道num被修改了,可见性得到验证。

  • volatile不保证原子性,原子性代表着不可被分割,完整性,中间不能被加塞。
class  MyData{
    volatile int num = 0;
    public  void add(){
        num++;
    }
}
public class VolatileAtomic {
    public static void main(String[] args) {
        MyData myData = new MyData();
        for(int i = 1;i<=20;i++){
            new Thread(() ->{
                for(int j = 1;j<=1000;j++){
                    myData.add();
                }
            }).start();
            System.out.println(Thread.currentThread().getName()+"\t"+String.valueOf(i));
        }
        while(Thread.activeCount()>2){
            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName()+myData.num);
    }
}
可以发现最后的结果不是每次都为20000,所以原子性不可被保证。
  • 禁止指令重排(cpu会自己做优化),重排时会导致执行顺序被打乱,所以volatile禁止指令重排

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值