Apakah AtomicInteger menangani sinkronisasi?
Jika dua utas bertambah sama int i
menggunakan i ++ , kita bisa mendapatkan masalah, karena i ++ bukanlah operasi atom. Itulah mengapa ada AtomicInteger.increment()
, yang membuat atom bertambah. Jadi jika kami memiliki 1 inti dan 2 utas yang dilakukan .increment()
, sama sekali tidak ada masalah (karena tidak dapat ditangguhkan di tengah operasi).
Tetapi bagaimana jika kita memiliki 2 inti dan 2 utas dan mereka secara paralel (pada saat yang sama) menyebutnya increment()
?
Mungkinkah ada kemungkinan mereka memuat nilai yang sama int i
? Artinya jika int i
itu 1 , hasil akhirnya akan menjadi 2 dan tidak 3 . Dalam hal ini kami tidak peduli apakah ini operasi atom karena keduanya mengambil nilai yang sama pada waktu yang sama ..
Intinya: apakah sinkronisasi ditangani oleh AtomicInteger?
Jawaban
Mungkinkah ada kemungkinan mereka memuat nilai yang sama
int i
?
Ya, ada, tapi sudah ditangani untuk Anda.
The incrementAndGet
Metode menggunakan atom "membandingkan dan set" operasi yang set nilai bertambah tetapi hanya jika nilai baru belum ditetapkan . Jika pembandingan gagal, incrementAndGet
ambil nilai baru dan coba lagi.
Efek bersihnya adalah, aman digunakan incrementAndGet
dari banyak utas.