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.