เมื่อเธรด tA เรียกใช้ tB.join () สาเหตุของมันไม่เพียง แต่รอให้ tB ตายหรือ tA ถูกขัดจังหวะ แต่สร้างความสัมพันธ์ก่อนเกิดขึ้นระหว่างคำสั่งสุดท้ายใน tB และคำสั่งถัดไปหลังจาก tB.join () ในเธรด tA
การดำเนินการทั้งหมดในเธรดเกิดขึ้นก่อนที่เธรดอื่นจะส่งคืนสำเร็จจากการเข้าร่วม () ในเธรดนั้น
มันหมายถึงโปรแกรม
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 Memory Model ไม่ต้องการ 'ถ่ายโอน' ค่าใหม่ของ 'sharedVar' จาก threadB ไปยังเธรดหลักโดยไม่มี heppens - ก่อนความสัมพันธ์ (การเริ่มต้นเธรดการรวมเธรดการใช้คำสำคัญ 'ซิงโครไนซ์' การใช้ตัวแปร AtomicXXX เป็นต้น)