共计 979 个字符,预计需要花费 3 分钟才能阅读完成。
Java 内存模型(JMM)是 Java 虚拟机的一个重要局部,用于管理程序中的内存拜访。JMM 定义了线程间共享内存的拜访规定,确保了内存可见性和原子性,并避免了竞争条件。
JMM 的次要内容包含以下几点:
1) 可见性:线程间共享内存的可见性,确保了线程间的信息能够相互可见。
2) 原子性:确保了内存拜访操作是原子操作,即不可中断。
3) 有序性:确保了内存拜访操作的程序。
JMM 通过应用同步、锁和 volatile 变量等技术来实现上述规定。应用同步和锁能够保障内存拜访的互斥性,从而确保可见性和原子性;应用 volatile 变量能够保障变量的可见性。
通过遵循 JMM 的规定,开发人员能够保障程序的正确性和可靠性,同时防止常见的内存问题,如竞争条件、死锁等。
1、volatile 可见性的实现原理
java 中的 volatile 关键字能够保障变量的可见性。它的实现原理是通过内存屏障和禁止重排序优化来实现的。
1) 内存屏障:内存屏障是一种非凡的指令,用于管制处理器缓存中的数据和内存的同步。内存屏障会强制处理器在执行该指令前写回缓存中的数据,并在执行该指令后从内存中读取数据。
2) 禁止重排序优化:禁止重排序优化是处理器在执行代码时所做的一种优化,其目标是进步代码的执行效率。在应用 volatile 关键字润饰的变量被批改时,编译器和处理器都会插入内存屏障指令,从而禁止重排序优化。
当多个线程共享一个 volatile 变量时,任何一个线程对该变量的批改,都会立即被其余线程看到。这是因为,当一个线程批改了该变量时,会强制将缓存中的数据写回内存,同时禁止重排序优化,从而保障了其余线程在读取该变量时读取的是最新的数据。
总的来说,volatile 关键字通过内存屏障和禁止重排序优化,确保了多个线程间共享变量的可见性。应用 volatile 关键字的变量在读取和批改操作时不会被缓存,而是间接从内存中读取或写入,从而确保了数据的一致性。
然而,请留神,应用 volatile 关键字仅仅保障了变量的可见性,并不能保障原子性。如果你须要保障变量的原子性,则能够应用 Java 的原子类或者同步机制。
另外,volatile 关键字还有一个毛病,就是性能比拟低。因为它的每次读取和批改操作都要间接从内存中读取或写入,从而造成了大量的内存读写操作,升高了程序的执行效率。因而,应用 volatile 关键字的中央要适当,不能滥用。