Java-关于多线程可见性的一些问题

1.请列出Happens-before的几种规则

1.单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作。
2.锁的happen-before原则:同一个锁的unlock操作happen-before此锁的lock操作。
3.volatile的happen-before原则:对一个volatile变量的的写操作happen-before对此变量的任意操作
4.happen-before的传递性原则:如果A操作happen-before B操作,B操作happen-before C操作,那么A操作 happen-before C操作
5.线程启动的happen-before原则:同一个线程的start方法happen-before此线程的其它方法。
6.线程中断的happen-before原则:对线程interrupt方法的调用happen-before被中断线程的检测到中断发送的代码。
7.线程终结的happen-before原则:线程中的所有操作都happen-before线程的终止检测。
8.对象创建的happen-before原则:一个对象的初始化完成先于他的finalize方法调用。

2.volatile 能使得一个非原子操作变成原子操作吗?为什么?

不能够完全保证,对一个变量使用了volatile关键字,如果操作该变量同时有多个指令,就不能保证程序完全正常。

3.哪些场景适合使用Volatile

我们期待一些字段的行为和预期一致的时候适合使用volatile变量。在多线程的场景下,需要保证其有序性,可见性又不需要保证原子性的情况使用volatile。
          如果需要保证其原子性的情况下只能使用synchronized锁。
         为什么首选volatile不选synchronized呢?
         因为synchronized是会造成阻塞线程,是串行来执行的,效率比较慢。
         volatile是通过自动使用lock汇编来添加内存屏障达到有序性和可见性的。

4.如果对一个数组修饰volatile,是否能够保证数组元素的修改对其他线程的可见?为什么?

只能保证数组本身发生改变时,其它线程可见。比如数据指向新的对象。但是数组内元素并不遵循happen-before原则。

5.锁对象----内存中---Mark World的变化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值