멀티스레딩에는
원자성, 가시성, 질서
1. 원자성이란 무엇입니까
즉, 하나의 작업 또는 여러 작업이 전체 또는 전체적으로 실행되는 프로세스입니다. 어떤 요인에 의해서도 중단되지 않거나 전혀 실행되지 않습니다.
아주 전형적인 예는 은행 계좌 이체 문제입니다.
예를 들어 계좌 A에서 계좌 B로 1,000위안을 이체하려면 계좌 A에서 1,000위안을 빼고 계좌 B에 1,000위안을 추가하는 두 가지 작업이 포함되어야 합니다. 예상치 못한 문제가 발생하지 않도록 하려면 이 두 작업은 원자성이어야 합니다.
i의 값을 읽고, i를 계산하고, i를 쓰는 것을 포함하는 i = i+1;과 같은 데이터를 연산할 때도 마찬가지입니다. 이 코드 줄은 Java에서 원자적이지 않으므로 다중 스레드 작업은 확실히 문제를 일으키므로 이 기능을 보장하려면 동기화 및 잠금도 사용해야 합니다.
(추천 동영상 튜토리얼: java video)
2. 가시성이란 무엇입니까
여러 스레드가 동일한 변수에 액세스하고 하나의 스레드가 이 변수의 값을 수정하면 다른 스레드가 즉시 수정 값을 볼 수 있습니다.
두 스레드가 서로 다른 CPU에 있는 경우 스레드 1이 i 값을 변경했지만 주 메모리로 새로 고쳐지지 않았으며 스레드 2가 i를 다시 사용하는 경우 i 값은 여전히 이전과 동일해야 합니다. 스레드 1이 스레드 2에 의해 변수를 수정했습니다. 가시성 문제인지 확인하지 못했습니다.
3. 질서란?
프로그램 실행 순서는 코드 순서대로 실행됩니다.
일반적으로 말하면, 프로그램 작업의 효율성을 높이기 위해 프로세서는 입력 코드를 최적화할 수 있습니다. 이는 프로그램의 각 문의 실행 순서가 코드의 순서와 일치한다는 것을 보장하지 않습니다. 프로그램의 최종 실행 결과와 코드의 실행 결과가 일치합니다. 다음과 같습니다:
int a = 10; //语句1 int r = 2; //语句2 a = a + 3; //语句3 r = a*a; //语句4
재주문으로 인해 그는 2-1-3-4, 1-3-2-4로 주문을 실행할 수도 있지만 2-1-4-3은 절대 실행할 수 없습니다. 이는 종속 관계를 깨뜨리기 때문입니다.
분명히 순서를 바꾸면 단일 스레드 작업에서는 문제가 발생하지 않지만 멀티 스레드에서는 반드시 그런 것은 아니므로 멀티 스레드로 프로그래밍할 때 이 문제를 고려해야 합니다.
추천 튜토리얼: Java 시작하기
위 내용은 멀티스레딩의 세 가지 주요 특징은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!