Java'da diğer temel değişkenler atomiktir, ancak Long ve Double'ın 8 bayt, 64 bitlik değişkenleri hariç.
Java depolama modeli, hem get hem de store işlemlerinin atomik olmasını gerektirir, ancak değişken olmayan uzun ve çift değişkenler için JVM, 64 bitlik okuma veya yazma işlemlerini iki 32 bitlik operasyona ayırmaya olanak tanır.
Okuma ve yazma işlemleri farklı iş parçacıklarında gerçekleşiyorsa, uçucu olmayan tip uzun bir uzun okumak bir değerin yüksek 32 biti ve diğerinin düşük 32 biti ile sonuçlanabilir.
Yani süresi dolmuş verilerle ilgilenmiyorsanız bile, çok iş parçacıklı bir programda paylaşılan, değiştirilebilir uzun ve çift değişkenleri kullanmak güvenli olmayabilir, ancak bunlar değişken ilan edilmedikçe veya kilitle korunmuyorsa.
Atomik işlemlerden bahsetmişken, okuma ve yazmanın atomik olduğu anlamına gelir, örneğin i=5; Bu atomik bir işlemdir.
Ancak, iki atomun işlemi birlikte yapılırsa, bu mutlaka atomik değildir; örneğin önce okuyup sonra yazmak gibi, o zaman değişken okunduktan sonra değiştirilmiş olabilir.
i++ böyle bir işlemdir, önce okunur ve sonra yazılır, yani tam sayı değişkeni atomiktir, i++ atomik işlem değildir.
for(int i=0; i<10000; i++){System.out.print(i)}
Sonunda 10.000 basmayacağımı ve yaklaşık 8-9 bin baskı yapacağımı göreceksiniz.
Ancak çoklu iş parçacığı durumunda, tam sayı değişkeni atomik olsa bile, iş parçacığı güvenlik sorunları olabilir, bu da iş parçacığı görünürlüğü sorunudur, bu yüzden değişken bir ifade eklemeniz gerekir.
Bu modifiyetör, her seferinde bellekten okunan ve kayıtlarda saklanmayan zorunlu bir değişkendir. |