package main

import (
	"fmt"
	"sync"
)

// Cache memakai RWMutex: banyak pembaca boleh masuk bersamaan.
type Cache struct {
	mu   sync.RWMutex
	data map[string]int
}

// Set menulis nilai; hanya satu penulis pada satu waktu.
func (c *Cache) Set(kunci string, nilai int) {
	c.mu.Lock()
	defer c.mu.Unlock()
	c.data[kunci] = nilai
}

// Get membaca nilai; pembaca lain boleh membaca bersamaan.
func (c *Cache) Get(kunci string) (int, bool) {
	c.mu.RLock()
	defer c.mu.RUnlock()
	v, ok := c.data[kunci]
	return v, ok
}

func main() {
	cache := &Cache{data: make(map[string]int)}

	cache.Set("apel", 12000)
	cache.Set("jeruk", 8000)

	pembaca := []string{"Budi", "Siti", "Anto"}
	hasil := make([]string, len(pembaca))

	var wg sync.WaitGroup
	wg.Add(len(pembaca))
	for i, nama := range pembaca {
		go func() {
			defer wg.Done()
			harga, ok := cache.Get("apel")
			hasil[i] = fmt.Sprintf("%s membaca apel: %d (ada=%v)", nama, harga, ok)
		}()
	}

	wg.Wait()
	for _, h := range hasil {
		fmt.Println(h)
	}
}
