>Java >java지도 시간 >메모리 모델이란 무엇이며 왜 필요한가요?

메모리 모델이란 무엇이며 왜 필요한가요?

零下一度
零下一度원래의
2017-06-25 10:32:562203검색

JAVA 메모리 모델

이 멀티스레딩 시리즈에서는 기본 메모리 모델을 자세히 다루지 않습니다

1. 메모리 모델은 무엇이며 왜 필요한가요?

최신 멀티 코어 프로세서에서 각 프로세서는 고유한 특성을 갖습니다.

각 프로세서가 언제든지 다른 프로세서가 무엇을 하는지 알 수 있도록 하려면 많은 오버헤드가 필요하며 일반적으로 불필요합니다.

스레드 간에 데이터를 공유할 때만 필요합니다. JAVA에서는 올바른 동기화를 통해 달성됩니다.        모델 소개

  부분 순서 관계: 반대칭, 반사성 및 전이 속성. 그러나 두 요소 A와 B에 대한 것입니다. , A가 B에 대해 편향하거나 B가 A에 대해 편향하는 관계를 반드시 만족시키지는 않습니다

  예: A와 B 사이에서 나는 B를 선호하지만 명시적인 선택을 할 필요는 없습니다

 JMM은 부분 순서 관계를 정의합니다 프로그램의 모든 작업에 대해 Happens-Before라고 합니다. 작업 B를 수행하는 스레드가 작업 A의 실행을 확인하도록 하려면 AB가 동일한 스레드에 있는지 여부에 관계없이 스레드의 결과가 Happens-Before를 충족해야 합니다. 관계가 발생하기 전에 JVM이 재정렬합니다

   

예: 잠금 작업은 여러 스레드 사이에서 실행 순서를 예측할 수 있습니다. 시간은 Happens-Before와 일치합니다. 잠금이 없으면 판단이 불가능합니다.

  3. 릴리스

    실제 이유: 공유 개체를 게시하고 다른 스레드에서 개체에 액세스하는 사이에는 명령 재정렬로 인해 개체가 해제됩니다. 올바르게 구성되지 않고

public class PossibleReordering {static int x = 0, y = 0;static int a = 0, b = 0;/** * 判断输出值将会非常困难:
     * 1:多线程之间的切换,导致可能的输出值:(0,1)(1,0)(1,1)
     * 2.指令重排序:one线程如a=1和x=b之间重排序,x=b(0),然后other线程被调度执行y=a(0),将导致(0,0)     */public static void main(String[] args) throws InterruptedException {
        Thread one = new Thread(new Runnable() {public void run() {
                a = 1;
                x = b;
            }
        });
        Thread other = new Thread(new Runnable() {public void run() {
                b = 1;
                y = a;
            }
        });
        one.start();
        other.start();
        one.join();
        other.join();
        System.out.println("( " + x + "," + y + ")");
    }
}

  

위 내용은 메모리 모델이란 무엇이며 왜 필요한가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.