Table of Contents
Java内存模型(JMM)定义了Java中的线程如何通过内存相互作用,它解释了一个线程所做的修改如何以及何时能被其他人看到. 理解JMM对于写正确同时的Java程序以及避免数据种族和能见度问题等常见问题至关重要.
Java 记忆模型的基本原理
JMM 指定了线程读写共享变量的规则,它确保操作是原子的,并为跨线程的变化的可见度提供保证。该模型引入了类似发生关系前的概念,这些概念决定了同时执行中的行动顺序。
实际实例
考虑一个简单的示例,一个线程更新一个共享变量,另一个线程读取它。如果没有适当的同步,读取线程可能会看到由于缓存或重排而导致的停滞数据。使用同步块或波动变量确保了根据JMM规则的可见度。
共同问题和解决办法
- Data Races: 当多个线程修改共享数据而不同步时, occur。 使用同步块或原子类来防止此现象 。
- 可视性问题: 由一条线程作出的修改对其他人来说是看不见的. 宣告共享变量为挥动性或使用明确的同步.
- 重排:[ 编译器或CPU重排可引起出乎意料的行为. 适当的同步可以防止重排问题.