package main

import (
	"fmt"
	"sync"
	"sync/atomic"
)

func main() {
	// Gaya modern: tipe atomic.Int64 lebih aman daripada fungsi pointer.
	var kunjungan atomic.Int64
	var wg sync.WaitGroup

	for range 8 {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for range 1250 {
				kunjungan.Add(1)
			}
		}()
	}
	wg.Wait()
	fmt.Println("total kunjungan:", kunjungan.Load())

	// Store dan Load: tulis dan baca nilai secara atomik.
	saldo := atomic.Int64{}
	saldo.Store(100)
	fmt.Println("saldo awal:", saldo.Load())

	// CompareAndSwap: ganti nilai hanya bila nilai lama masih sesuai.
	berhasil := saldo.CompareAndSwap(100, 150)
	fmt.Println("CAS pertama (100 → 150):", berhasil)
	berhasil = saldo.CompareAndSwap(100, 200)
	fmt.Println("CAS kedua (100 → 200):", berhasil)
	fmt.Println("saldo akhir:", saldo.Load())

	// Gaya lama: fungsi package atomic yang menerima pointer.
	var gayaLama int64
	atomic.AddInt64(&gayaLama, 10)
	fmt.Println("gaya lama AddInt64:", atomic.LoadInt64(&gayaLama))
}
