Java 内存模型相关问题

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

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

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

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

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

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

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

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

发布了87 篇原创文章 · 获赞 79 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41585840/article/details/105356367
今日推荐