package main

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

var (
	bukaSesi      sync.Once
	eksekusiInit  atomic.Int32
	pemanggilanDo atomic.Int32
	koneksi       string
)

func buatKoneksi() {
	eksekusiInit.Add(1)
	koneksi = "koneksi-aktif"
}

func main() {
	var wg sync.WaitGroup

	for range 8 {
		wg.Add(1)
		go func() {
			defer wg.Done()
			pemanggilanDo.Add(1)
			bukaSesi.Do(buatKoneksi)
		}()
	}
	wg.Wait()

	fmt.Println("pemanggilan Do:", pemanggilanDo.Load(), "kali")
	fmt.Println("eksekusi buatKoneksi:", eksekusiInit.Load(), "kali")
	fmt.Println("koneksi:", koneksi)
}
