Java 内存模型相关问题

问题一:什么是 Java 的内存模型,Java 中各个线程是怎么彼此看到
对方的变量的?

Java 的内存模型定义了程序中各个变量的访问规则,即在虚拟机中将
变量存储到内存和从内存中取出这样的底层细节。 此处的变量包括实例字段、静态字段和构成数组对象的元素,但是不包括局部变量和方法参数,因为这些是线程私有的,不会被共享,所以不存在竞争问题。
==Java 中各个线程是怎么彼此看到对方的变量的呢?Java 中定义了主内
存与工作内存的概念: ==
所有的变量都存储在主内存,每条线程还有自己的工作内存,保存了被该线程使用到的变量的主内存副本拷贝。 线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,不能直接读写主内存的变量。不同的线程之间也无法直接访问对方工作内存的变量,线程间变量值的传递需要通过主内存。

问题二:请谈谈 volatile 有什么特点,为什么它能保证变量对所有线
程的可见性?

关键字 volatile 是 Java 虚拟机提供的最轻量级的同步机制。当一个变量被定义成 volatile 之后,具备两种特性:

  • 保证此变量对所有线程的可见性。当一条线程修改了这个变量的值,新
    值对于其他线程是可以立即得知的。而普通变量做不到这一点。
  • 禁止指令重排序优化。普通变量仅仅能保证在该方法执行过程中,得到
    正确结果,但是不保证程序代码的执行顺序。

问题三:既然 volatile 能够保证线程间的变量可见性,是不是就意味
着基于 volatile 变量的运算就是并发安全的?

显然不是的。基于 volatile 变量的运算在并发下不一定是安全的。volatile 变量在各个线程的工作内存,不存在一致性问题(各个线程的工作内存中 volatile 变量,每次使用前都要刷新到主内存)。 但是 Java 里面的运算并非原子操作,导致 volatile 变量的运算在并发下一样是不安全的。

问题四:请对比下 volatile 对比 Synchronized 的异同。
Synchronized 既能保证可见性,又能保证原子性,而 volatile 只能
保证可见性,无法保证原子性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值