Ini sebuah contoh, karena sebuah contoh seringkali lebih jelas daripada penjelasan yang panjang. Misalkan foo
adalah variabel tipe long
. Operasi berikut bukan operasi atom:
foo = 65465498L;
Memang, variabel ditulis menggunakan dua operasi terpisah: satu yang menulis 32 bit pertama, dan yang kedua yang menulis 32 bit terakhir. Itu berarti bahwa utas lain mungkin membaca nilai foo
, dan melihat kondisi perantara.
Membuat operasi atom terdiri dari penggunaan mekanisme sinkronisasi untuk memastikan bahwa operasi terlihat, dari utas lainnya, sebagai atom tunggal (yaitu tidak dapat dibelah-belah), operasi. Itu berarti bahwa utas lainnya, setelah operasi dibuat atom, akan melihat nilai foo
sebelum penugasan, atau setelah penugasan. Tetapi tidak pernah nilai tengahnya.
Cara sederhana untuk melakukan ini adalah membuat variabel mudah berubah :
private volatile long foo;
Atau untuk menyinkronkan setiap akses ke variabel:
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
Atau untuk menggantinya dengan AtomicLong
:
private AtomicLong foo;