스레드 tA가 tB.join ()을 호출하면 tB가 죽을 때까지 기다리거나 tA 자체가 인터럽트 될뿐만 아니라 tB의 마지막 명령문과 tA 스레드의 tB.join () 뒤의 다음 명령문 사이의 관계 전에 발생합니다.
스레드의 모든 작업은 다른 스레드가 해당 스레드의 join ()에서 성공적으로 반환되기 전에 발생합니다.
프로그램을 의미한다
class App {
// shared, not synchronized variable = bad practice
static int sharedVar = 0;
public static void main(String[] args) throws Exception {
Thread threadB = new Thread(() -> {sharedVar = 1;});
threadB.start();
threadB.join();
while (true)
System.out.print(sharedVar);
}
}
항상 인쇄
>> 1111111111111111111111111 ...
그러나 프로그램
class App {
// shared, not synchronized variable = bad practice
static int sharedVar = 0;
public static void main(String[] args) throws Exception {
Thread threadB = new Thread(() -> {sharedVar = 1;});
threadB.start();
// threadB.join(); COMMENT JOIN
while (true)
System.out.print(sharedVar);
}
}
뿐만 아니라 인쇄 할 수 있습니다
>> 0000000000 ... 000000111111111111111111111111 ...
그러나
>> 00000000000000000000000000000000000000000000 ...
항상 '0'입니다.
Java 메모리 모델은 관계 이전 (스레드 시작, 스레드 조인, 'synchonized'키워드 사용, AtomicXXX 변수 사용 등)없이 threadB에서 기본 스레드로 'sharedVar'의 새로운 값을 '전송'할 필요가 없기 때문입니다.