bu iki değişken olduğunu varsayalım:
public int a = 0;
public volatile int b = 0;
Ve bir iplik
yapar varsayalım başka bir iş parçacığı bu değerleri okur ve == 2 b, o zaman da bir == görmek pilli görürse
a = 1;
b = 2;
1.
Ancak okuma iş parçacığı a == 1
ve b == 0
görebildi, çünkü iki yazma işlemi bir atomik işlemin parçası değil, bu nedenle okuma iş parçacığı, ilk iş parçacığı b
için bir değer atamadan önce a
için yapılan değişikliği görebiliyordu.
bu iki değişken erişimi eşitlemek gerekir, bu iki yazma atomik yapmak için:
synchronized (lock) {
a = 1;
b = 2;
}
...
synchronized (lock) {
System.out.println("a = " + a + "; b = " + b);
}
Ve bu durumda
, okuma ipliği
a == 0
ve
b == 0
veya
a == 1
ve
b == 2
görürsünüz, ancak asla ara devlet değildir.
Bu 'volatile', C/C++ ile aynı garantiyi Java'da sağladığını düşünmüyorum. Özellikle, C'ye ardışık tutarlılık dediğiniz şeyi sağladığını düşünmüyorum (yani bellek çiti diğer değişkenler için de geçerlidir) - TBC. – assylias
@assylias C/C++ 'da volatile aynı anlama sahip demek istemedim. Eminim öyle değil.C/C++ ve Java arasında yaygın olan 'sıralı tutarlılık ve atomisite' kavramına atıfta bulundum. C/C++ uçucu anahtar sözcüğü değişken kullanımın optimizasyonunu durdurur ve bir değişken değişken ile işlemden önce belirtilen işlemler arasında sıralı tutarlılık sağlamak için kullanılmaz .. –