pemrograman

Mengenal Dan Implementasi Sync Atomic Pada Golang

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 tipe primitive variabel int64
  • AddUint32 digunakan untuk melakukan locking untuk tipe primitive variable uint32
  • 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.

comments powered by Disqus