English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
有时候编译器、处理器的优化会导致runtime与我们设想的不一样,为此Java对编译器和处理器做了一些限制,JAVA内存模型(JMM)将这些抽象出来,这样编写代码时就无需考虑那么多底层细节,并保证“只要遵循JMM的规则编写程序,其运行结果一定是正确的”。
JMM的抽象结构
在Java中,所有的实例、静态变量存储在堆内存中,堆内存是可以在线程间共享的,这部分也称为共享变量。而局部变量、方法定义参数、异常处理参数是在栈中的,栈内存不在线程间共享。
而由于编译器、处理器的优化,会导致共享变量出现可见性问题,像在多核处理器中(multi-core processor)-processor),线程可以在不同的处理器上执行,而处理器之间缓存不一致,会使共享变量出现可见性问题,有可能两个线程看到同一个变量的不同值。
JMM将这些硬件做的优化抽象成每个线程都有一个本地内存。需要读写共享变量时,从主内存中复制一份到本地内存。当写共享变量时,先写入本地内存中,在将来某个时间再刷新到主内存中。当再次读共享变量时,则只会从本地内存中读取。
这样线程间通讯就需要经过两步:
写线程:将本地内存刷新到主内存中读线程:从主内存读取更新后的值
这样在写-读之间就有一个延迟:本地内存何时刷新到主内存中?导致可见性问题,不同线程可能看到的共享变量不一样。
happens之前-before
从字面上看happens之前-before的意思是“发生在此之前”。这是Java对程序执行顺序制定的规则,实现同步必须遵循该规则。这样程序员只需要写出正确的同步程序,happens之前-before保证运行结果不会出错。
A가 발생합니다-before B不仅仅表示A在B之前执行,还意味着A的执行结果对B可见,这保证了可见性。
A가 발생합니다-before B之前,A也不一定要在B之前执行,如果AB交替执行,执行结果仍然正确,则允许编译器、处理器进行优化重排序。所以只要程序结果正确,编译器、处理器如何优化,如何重排序都没有问题,都是好的。
happens之前-before规则
程序顺序规则:在一个线程中,前面的操作happens之前-before后面的操作锁规则:对同一个锁,解锁happens之前-volatile域规则:写volatile变量,happens之前-before 뒤에 있는 모든 volatile 변수의 읽기 작업에 대한 전달성: A가 happens-before B, B가 happens-before C, 그렇다면 A가 happens-before 스레드B를 시작() 규칙: 스레드A가 ThreadB.start()를 실행하면, ThreadB.start()가 happens-before 스레드B의 어떤 작업도 join() 규칙: 스레드A가 ThreadB.join()를 실행하면, 스레드B의 모든 작업이 happens-before ThreadB.join()
이 예제는 happens를 이해하는 데 도움이 됩니다-before
double pi = 3.14; //A double r = 1.0; //B double area = pi * r *r; //C
이곳에는 세 가지 happens가 있습니다-before 관계, 규칙1、2이는 프로그램 순서 규칙, 규칙3이는 전달성 규칙으로 유도된 것입니다:
A가 발생합니다-B 전에 B가 발생합니다-C A가 발생하기 전에-C 전에
C는 A와 B에 의존하지만, A와 B는 서로에게도 의존하지 않습니다. 따라서 A와 B가 재정렬되더라도 실행 결과가 변경되지 않습니다. 이 재정렬은 JMM에서 실행됩니다.
이 두 가지 실행 순서의 결과는 모두 올바르습니다.
이것이 우리가 제공한 Java 메모리 모델 JMM 학습 감상의 전체 내용입니다. 더 많은 질문이 있으면 아래에 댓글을 달고 논의해 주세요. 너무나도 지금 강의를 지지해 주셔서 감사합니다.
언급: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권은 저작자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 웹사이트는 소유권을 가지지 않으며, 인공 편집을하지 않았으며, 관련 법적 책임을 부담하지 않습니다. 저작권 문제가 있으면 메일을 보내 주세요: notice#oldtoolbag.com(메일을 보내면, #을 @으로 변경하여 신고하시고, 관련 증거를 제공해 주세요. 일단 확인되면, 이 사이트는 즉시 위반된 내용을 삭제합니다.)