Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
14 Jun 2023 · 2 mnt baca ·Artikel 103 / 119
Go

Cara Membuat RW Mutex Dan Kegunaanya Pada Golang

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

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.

go
 1type Counting struct {
 2	RWMutex    sync.RWMutex
 3	TotalCount int
 4}
 5
 6func (c *Counting) Add(amount int) {
 7	c.RWMutex.Lock()
 8	c.TotalCount = c.TotalCount + amount
 9	c.RWMutex.Unlock()
10}
11
12func (c *Counting) GetCount() int {
13	c.RWMutex.RLock()
14	count := c.TotalCount
15	c.RWMutex.RUnlock()
16	return count
17}
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.
go
 1func main() {
 2	count := Counting{}
 3	for i := 0; i < 1000; i++ {
 4		go func() {
 5			count.Add(1)
 6			fmt.Println("count : ", count.GetCount())
 7		}()
 8	}
 9	time.Sleep(5 * time.Second)
10	fmt.Println("Final Count : ", count.GetCount())
11}
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.
bash
1count :  1
2count :  30
3..
4..
5count :  986
6count :  537
7Final 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.

Artikel Terkait

💬 Komentar