İşte bir örnek, çünkü bir örnek genellikle uzun bir açıklamadan daha açıktır. Farz edin ki foo
bir tür değişkendir long
. Aşağıdaki işlem bir atomik işlem değildir:
foo = 65465498L;
Aslında, değişken iki ayrı işlem kullanılarak yazılır: biri ilk 32 biti ve diğeri son 32 biti yazar. Bu, başka bir iş parçacığının değerini okuyabileceği foo
ve ara durumu görebileceği anlamına gelir .
İşlemin atomik hale getirilmesi, işlemin herhangi bir diğer iplikten tek bir atomik (yani parçalara bölünemez) işlem olarak görülmesini sağlamak için senkronizasyon mekanizmalarının kullanılmasından oluşur. Başka bir deyişle, işlem atomik hale getirildikten foo
sonra, atamadan önce veya atamadan sonra değerini görür . Ama asla ara değer.
Bunu yapmanın basit bir yolu, değişkeni değişken yapmaktır :
private volatile long foo;
Veya değişkene her erişimi senkronize etmek için:
public synchronized void setFoo(long value) {
this.foo = value;
}
public synchronized long getFoo() {
return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized
Veya aşağıdakilerle değiştirmek için AtomicLong
:
private AtomicLong foo;