pemrograman

Cara Membuat RW Mutex Dan Kegunaanya Pada Golang

Pengenalan Sync.RWMutex

Setelah kita pernah mempelajari Pengenalan dan Pembuatan `Mutex` pada postingan sebelumnya, lalu kita akan lanjut ke tahap selanjutnya yaitu pengenalan RWMutex. Nah apa bedanya dengan yang sebelumnya?

Perbedaanya yaitu lebih kepada penggunaan Mutex tersebut. Mutex biasanya digunakan hanya untuk satu kali saja dalam artian saat melakukan pengesetan variabel, sedangkan jika kita menggunakan RWMutex digunakan untuk kasus dimana kita ingin melakukan locking tidak hanya pada proses mengubah data (write), tetapi juga locking terhadap membaca (read) data tersebut.

Dalam hal ini bisa saja sebenarnya menggunakan Mutex tetapi akan rebutan antara proses membaca dan mengubah data, maka Golang menyediakan struct sync.RWMutex (Read Write Mutex) untuk menangani masalah ini dimana memiliki dua lock, yaitu locking untuk membaca dan locking untuk menulis.

Implementasi Kode sync.RWMutex

Pada kali ini kita akan mengubah kode pada postingan sebelumnya menjadi seperti dibawah ini. Pertama kali kita perlu ubah yaitu dengan membuat struct untuk kebutuhan membaca dan mengubah data dari variabel di dalam struct tersebut.

type Counting struct {
	RWMutex    sync.RWMutex
	TotalCount int
}

func (c *Counting) Add(amount int) {
	c.RWMutex.Lock()
	c.TotalCount = c.TotalCount + amount
	c.RWMutex.Unlock()
}

func (c *Counting) GetCount() int {
	c.RWMutex.RLock()
	count := c.TotalCount
	c.RWMutex.RUnlock()
	return count
}

Setelah itu, kita juga kita membuat fungsi main yang memanggil fungsi mengubah dan membaca variabel dari struct yang sudah kita buat diatas. Berikut fungsi main yang sudah kita ubah.

func main() {
	count := Counting{}
	for i := 0; i < 1000; i++ {
		go func() {
			count.Add(1)
			fmt.Println("count : ", count.GetCount())
		}()
	}
	time.Sleep(5 * time.Second)
	fmt.Println("Final Count : ", count.GetCount())
}

Maka hasil kode tersebut ketika kita jalankan akan sama dengan menceta 1000 count data. Dalam hal ini implementasinya sama saja dengan Mutex sebelumnya tetapi kita ada kebutuhan untuk membaca data pada saat menjalankan proses tambah data tersebut sehingga kita perlu menggunakan RWMutex.

count :  1
count :  30
..
..
count :  986
count :  537
Final Count :  1000

Kesimpulan

RWMutex dan Mutex dalam kebutuhannya sama saja yaitu digunakan untuk kondisi locking dan unlocking proses dimana kita akan melakukan membaca dan menulis pada satu variabel agar tidak saling berebutan jika kita gunakan goroutine yang mana akses-nya bersamaan. Dalam hal ini dari beberapa sumber artikel yang sudah penulis baca, ternyata ada sisi kelemahan dari penggunaan RWMutex, yaitu dari sisi performance menjadi lebih lambat karena penggunaan locking yang membutuhkan proses yang lebih lama.

comments powered by Disqus