Dalam buku Java Efektif, ia menyatakan:
Spesifikasi bahasa menjamin bahwa membaca atau menulis variabel adalah atom kecuali variabelnya bertipe
long
ataudouble
[JLS, 17.4.7].
Apa arti "atomik" dalam konteks pemrograman Java, atau pemrograman secara umum?
volatile long
atauvolatile double
membuat atomic read dan write atomic.Jawaban:
Ini sebuah contoh, karena sebuah contoh seringkali lebih jelas daripada penjelasan yang panjang. Misalkan
foo
adalah variabel tipelong
. Operasi berikut bukan operasi atom: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 :
Atau untuk menyinkronkan setiap akses ke variabel:
Atau untuk menggantinya dengan
AtomicLong
:sumber
"Operasi atom" berarti operasi yang tampaknya seketika dari perspektif semua utas lainnya. Anda tidak perlu khawatir tentang operasi yang sebagian selesai ketika jaminan berlaku.
sumber
Ini adalah sesuatu yang "muncul ke seluruh sistem terjadi secara instan", dan jatuh di bawah kategorisasi Linearizability dalam proses komputasi. Mengutip artikel yang ditautkan lebih lanjut:
Jadi, misalnya, dalam konteks sistem basis data, seseorang dapat memiliki 'komitmen atom', yang berarti bahwa Anda dapat mendorong perubahan set pemutakhiran ke basis data relasional dan perubahan-perubahan itu akan diserahkan, atau tidak ada sama sekali dalam jika terjadi kegagalan, dengan cara ini data tidak menjadi rusak, dan konsekuensi dari penguncian dan / atau antrian, operasi selanjutnya akan menjadi penulisan atau pembacaan yang berbeda, tetapi hanya setelah fakta. Dalam konteks variabel dan threading ini hampir sama, diterapkan pada memori.
Kutipan Anda menyoroti bahwa perilaku ini tidak diharapkan dalam semua kasus.
sumber
Baru saja menemukan posting Operasi Atom vs Non-Atom sangat membantu saya.
sumber
Jika Anda memiliki beberapa utas yang menjalankan metode m1 dan m2 dalam kode di bawah ini:
Anda memiliki jaminan bahwa setiap panggilan thread
m2
akan membaca 0 atau 5.Di sisi lain, dengan kode ini (
i
panjangnya):panggilan thread
m2
dapat membaca 0, 1234567890L, atau beberapa nilai acak lainnya karena pernyataani = 1234567890L
tersebut tidak dijamin atom untuklong
(JVM dapat menulis 32 bit pertama dan 32 bit terakhir dalam dua operasi dan sebuah thread dapat mengamatii
di antaranya) .sumber
Di Jawa membaca dan menulis bidang semua jenis kecuali panjang dan ganda terjadi secara atom, dan jika bidang tersebut dideklarasikan dengan pengubah volatil, bahkan panjang dan ganda dibaca dan ditulis secara atom. Artinya, kita mendapatkan 100% apa yang ada di sana, atau apa yang terjadi di sana, juga tidak ada hasil antara dalam variabel.
sumber