TA çağrısı tB.join () çağrısının nedenleri, yalnızca tB'nin ölmesini beklemekle kalmaz veya tA kendi kendine kesilmez, aynı zamanda tB'deki son ifade ile tA iş parçacığında tB.join () öğesinden sonraki bir sonraki ifade arasında gerçekleşir.
Bir iş parçacığındaki tüm eylemler, başka bir iş parçacığı o iş parçasındaki bir join () öğesinden başarıyla geri dönmeden önce gerçekleşir.
Program demek
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);
}
}
Her zaman yazdır
>> 1111111111111111111111111 ...
Ama program
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);
}
}
Sadece yazdırabilir
>> 0000000000 ... 000000111111111111111111111111 ...
Fakat
>> 00000000000000000000000000000000000000000000 ...
Her zaman sadece '0'.
Java Bellek Modeli, `` sharedVar '' ın yeni değerinin, ileti dizisinden önceki iş parçacığı olmadan ana iş parçacığına 'aktarılmasını gerektirmez (iş parçacığı başlatma, iş parçacığı birleşimi,' eşzamanlı 'anahtar sözcük kullanımı, AtomicXXX değişkenlerinin kullanımı, vb.).