java关键字 valotile_Java多线程-volatile关键字

关键字 volatile 的作用主要有两个:

1)使变量线程间可见;

2)禁止指令重排序(CPU和编译器为了提升程序的执行效率, 通常会按照一定的规则对指令进行优化, 如果两条指令互不依赖, 则有可能它们执行的顺序并不是源代码编写的顺序)。

因私有堆栈和公共堆栈值不同导致的死循环

示例:

public classVolatileTest1 {public static void main(String[] args) throwsInterruptedException {

RunThread thread= newRunThread();

thread.start();

Thread.sleep(1000);

thread.setRunning(false);

System.out.println("已经赋值为 false");

}static class RunThread extendsThread {private boolean isRunning = true;public booleanisRunning() {returnisRunning;

}public void setRunning(booleanisRunning) {this.isRunning =isRunning;

}

@Overridepublic voidrun() {

System.out.println("进入run了");while (isRunning == true) {

}

System.out.println("线程被停止了");

}

}

}

运行结果:

29eba50b3f9a18a657655c9b853fbb94.png

可以看到,结果进入死循环了。原因是 thread 线程一直在拿它自己线程的私有栈中的 isRunning 的值来判断,而 threa.setRunning(false) 虽然被执行,但是更新的却是公共堆栈中的 isRunning。

解决方案,就是为 isRunning 加上 valotile 修饰,让 thread 线程每次拿 isRunning 的值,都是公共堆栈中拿取

线程私有堆栈

24f623c1f6c5b80f257c1769e5cf726b.png

volatile变量读取公共内存

bf78ad1d39c57444fd8c3a38252e8700.png

变量在内存中的工作过程

da8ba96d95e4e7fe66b64863fa34efc3.png

synchornized 和 volatile 对比

1)关键字volatile 是线程同步的轻量级实现,所以 volatile 性能比 synchronized 要好,并且 volatile 只能修饰变量,synchronized 可以修饰方法 和 代码块

2)多线程访问 volatile 不会发生阻塞,而 synchronized 会出现阻塞

3)volatile 保证数据的可见性,但不能保证数据的原子性; 而 synchronized 保证了原子性,也可以间接保证可见性

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值