Pengenalan sync.Atomic
Untuk operasi atomik pada variabel pada golang, paket sync/atomic
menawarkan metode tingkat rendah tertentu. Di Go, metode ini memungkinkan beberapa goroutine
untuk mengubah variabel bersama dengan aman tanpa menggunakan kunci atau sinkronisasi eksplisit lainnya. Fungsi seperti AddInt64
, AddUint32
, CompareAndSwapInt32
, dll digunakan untuk melakukan aritmatika dasar pada berbagai jenis variabel dapat ditemukan dalam paket atom
. Metode AddInt64
misalnya, menjamin bahwa modifikasi yang dibuat oleh goroutine
lain akan terlihat saat menambahkan nilai tertentu ke variabel int64
dengan gaya atomik.
Kenapa kita harus menggunakan sync.atomic
?
Kita bisa menggunakan sync.Atomic
ini sebenarnya secara teknik sama saja seperti kita menggunakan sync.Mutex
dengan mekanisme locking-nya. Tetapi disini agar mempermudah melakukan locking pada suatu variabel kita juga bisa menggunakan sync.Atomic
yang mana perintah-nya lebih mudah.
Penggunaan Method
Beberapa method yang bisa kita gunakan untuk implementasi sync.Atomic
:
AddInt64
digunakan untuk melakukan locking untuk tipeprimitive
variabelint64
AddUint32
digunakan untuk melakukan locking untuk tipeprimitive
variableuint32
- dan masih banyak lagi kita bisa kunjungi saja link https://pkg.go.dev/sync/atomic
Implementasi dan sampel sync.atomic
Fungsi seperti LoadInt32
, StoreInt64
, LoadPointer
memuat dan menyimpan data dari dan ke variabel secara atomic
. Akses variabel dengan aman yang dibagikan oleh beberapa goroutine
dengan utilitas praktis ini. Paket atom memungkinkan perubahan yang aman dari variabel bersama, seperti yang ditunjukkan di sini:
func main() {
var wg = &sync.WaitGroup{}
var counter int64 = 0
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
for j := 0; j < 100; j++ {
atomic.AddInt64(&counter, 1)
}
wg.Done()
}()
}
wg.Wait()
fmt.Println("result ", atomic.LoadInt64(&counter))
}
Bisa kita lihat bahwa pada saat kita melakukan set ke dalam variabel counter
kita menggunakan atomic.AddInt64(&counter, 1)
. Disini dimaksudkan agar mekanisme locking itu bisa kita gunakan dan tidak ada race condition
ketika akan melakukan set ke variabel dengan waktu yang bersamaan. Lalu ketika kita akan mengambil data dari variabel counter
, maka kita gunakan atomic.LoadInt64(&counter)
untuk mendapatkan data variabel yang terakhir dan tidak ada lagi nilai yang tertinggal pada variabel tersebut.
Kesimpulan
sync/atomic
ini adalah sama saja seperti halnya mekanisme locking yang pernah kita pelajari sebelumnya pada
Mengenal Sync Mutex. Tetapi ini menjadi opsi bagi kita jika ingin melakukan explorasi lebih lanjut terhadap locking. Tetapi perlu dicatat sync/atomic
ini hanya berlaku untuk variabel-variabel yang primitive
saja karena yang didukung oleh library tersebut.