package main

import (
	"fmt"
	"sync"
)

// CounterAman melindungi field nilai dengan sync.Mutex,
// sehingga hanya satu goroutine yang boleh mengubahnya pada satu waktu.
type CounterAman struct {
	mu    sync.Mutex
	nilai int
}

func (c *CounterAman) Tambah() {
	c.mu.Lock()
	defer c.mu.Unlock()
	c.nilai++
}

func (c *CounterAman) Nilai() int {
	c.mu.Lock()
	defer c.mu.Unlock()
	return c.nilai
}

func main() {
	var wg sync.WaitGroup
	counter := &CounterAman{}

	for range 8 {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for range 1250 {
				counter.Tambah()
			}
		}()
	}

	wg.Wait()
	fmt.Println("nilai counter:", counter.Nilai())
}
