Mastering Golang
  • Tentang Go
  • Instalasi Go
  • Membuat Project Go
  • Go Run & Go Build
  • Apa itu Package pada Go
  • Imports dan Exports
  • Variabel
  • Tipe Data
  • Konstanta dan Komentar
  • Operator
  • Type Conversion
  • Kondisional - IF
  • Kondisional - Switch Case
  • Looping
  • Array
  • Array - Looping
  • Slices
  • Pointer
  • Map
  • Fungsi
  • Struct
  • Method
  • Interface
  • Interface Kosong
  • Concurrency
  • Concurrency - Goroutines
  • Channel
  • Buffered Channel
  • Channel - Close and Range
  • Channel - Direction
  • Channel - Select
  • Concurrency - WaitGroup
  • Concurrency - Mutex
  • JSON Data
  • SQL
  • URL Parsing
  • GO Vendor
  • Unit Testing
  • Go Basic for Web Development
    • Aplikasi Web pada Go - Hello World
    • Root Routing
    • Query String
    • Web Service API Server
    • HTTP Basic Auth
    • RESTFul API dengan Gin dan Gorm
Powered by GitBook
On this page

Was this helpful?

Concurrency - Mutex

PreviousConcurrency - WaitGroupNextJSON Data

Last updated 4 years ago

Was this helpful?

Sebelum membahan tentang Mutex, ada hal penting di dalam concurrent programming. Ketika program berjalan secara concurrent, tidak boleh terjadi lebih dari satu goroutine, mengakses data yang sama pada waktu yang bersamaan (benar-benar bersamaan). Ketika hal ini terjadi, nilai data tersebut akan menjadi kacau dan conflict.

Misalnya kita ingin melakukan proses counter dimulai dari initial value 0 dan bertambah 1 setiap perulangan dimana hasil akhirnya adalah 1000 .

x = x + 1

Jika program di atas dijalankan oleh lebih dari 1 goroutine maka kemungkinan yang akan terjadi adalah sebagai berikut:

Mari kita lihat contoh kasus berikut ini dimana akan dijalankan oleh 1000 goroutine tanpa menggunakan Mutex:

package main  

import (  
    "fmt"
    "sync"
    )
var x  = 0  

func increment(wg *sync.WaitGroup) {  
    x = x + 1
    wg.Done()
}

func main() {  
    var w sync.WaitGroup
    for i := 0; i < 1000; i++ {
        w.Add(1)        
        go increment(&w)
    }
    w.Wait()
    fmt.Println("final value of x", x)
}

Menggunakan Mutex

Mari kita menggunakan Mutex untuk menyelesaikan kasus di atas.

package main  

import (  
    "fmt"
    "sync"
)

var x  = 0  

func increment(wg *sync.WaitGroup, m *sync.Mutex) {  
    m.Lock()
    x = x + 1
    m.Unlock()
    wg.Done()   
}

func main() {  
    var w sync.WaitGroup
    var m sync.Mutex
    
    for i := 0; i < 1000; i++ {
        w.Add(1)        
        go increment(&w, &m)
    }
    
    w.Wait()
    fmt.Println("final value of x", x)
}

adalah sebuah tipe data. Pada kode di atas kita membuat a zero value pada variabel m yang bertipe Mutex pada baris kode ke-15. Kita mengubah behaviour pada fungsi increment sehingga kode x = x + 1 berada diantara m.Lock() and m.Unlock(). Ini membuat hanya 1 goroutine yang bisa menjalankan statement tersebut dalam 1 waktu.

Mutex
source: https://golangbot.com/mutex/
Terjadi perbedaan nilai setiap program di jalankan
Menjalankan program dengan Mutex