jmm的重排序,可见性,原子性
时间: 2023-09-12 18:01:36 浏览: 103
JMM是Java Memory Model(Java内存模型)的缩写,它定义了Java程序中多线程并发访问共享变量时的行为规范。JMM的设计目的是为了保证多线程程序在不同的硬件和操作系统平台上的可移植性,并提供一定的可见性和原子性保证。
重排序是指编译器和处理器对指令的执行顺序进行优化的一种技术。由于指令的重排序,原本在代码中的先后顺序可能被打乱,但是这种重排序不会影响单线程程序的执行结果。然而对于多线程程序来说,重排序可能会导致线程安全问题。
可见性是指当一个线程对共享变量进行了修改后,其他线程是否能够立即看到这个修改。在JMM中,由于为了性能考虑,对于普通的共享变量,JVM会对读写操作进行重排序,从而可能导致一个线程修改了共享变量后,其他线程无法立即看到这个修改的结果。为了保证可见性,我们可以使用volatile关键字来修饰共享变量,强制线程对共享变量的读写操作都通过主内存进行,从而解决了可见性问题。
原子性是指一个操作是不可中断的,要么全部执行成功,要么全部不执行。在多线程程序中,对于一些涉及到多步操作的操作,如果没有保证原子性,可能会导致线程安全问题。为了保证原子性,可以使用synchronized关键字或者Lock来进行同步,保证任意时刻只有一个线程可以执行这些操作,从而解决了原子性问题。
总之,JMM的重排序、可见性和原子性是为了解决多线程程序中的线程安全问题而提出的。重排序可能导致程序执行结果和预期不符,可见性问题可能导致线程无法看到其他线程对共享变量的修改,原子性问题可能导致操作只完成了一部分而不是全部。通过合理地使用volatile关键字和同步机制,可以有效地解决这些问题。
阅读全文