1. Apa itu Pola Singleton

Pola Singleton adalah pola desain pembuatan yang memastikan sebuah kelas hanya memiliki satu instance dan memberikan titik akses global ke instance tersebut untuk diambil. Pola singleton umumnya digunakan dalam skenario di mana sumber daya perlu dibagikan atau akses ke suatu instance spesifik perlu dikontrol.

2. Karakteristik dan Keuntungan Pola Singleton

Pola Singleton memiliki karakteristik dan keuntungan berikut:

  • Memastikan kelas hanya memiliki satu objek instance
  • Memberikan titik akses global agar kode eksternal bisa mendapatkan instance tersebut
  • Menghindari pembuatan instance yang berulang, sehingga menghemat sumber daya sistem

3. Skenario Aplikasi dari Pola Singleton

Pola Singleton cocok untuk skenario aplikasi berikut:

  • Pembuat Log: Memastikan hanya ada satu pembuat log untuk seluruh sistem untuk mencegah pencatatan ganda.
  • Pool Koneksi Basis Data: Di lingkungan dengan konkurensi tinggi, menggunakan Pola Singleton dapat menghindari pembuatan dan penghancuran koneksi basis data yang sering terjadi.

4. Implementasi Pola Singleton di Golang

Di Golang, terdapat berbagai cara untuk mengimplementasikan Pola Singleton. Berikut adalah dua metode implementasi umum.

4.1. Implementasi menggunakan Inisialisasi Malas (Lazy Initialization) dan Inisialisasi Antusias (Eager Initialization)

Inisialisasi malas menciptakan objek instance saat pertama kali digunakan, sementara inisialisasi antusias menciptakan objek instance saat program dimulai.

// Implementasi Pola Singleton dengan inisialisasi malas
package singleton

type Singleton struct {
}

var instance *Singleton

func GetInstance() *Singleton {
    if instance == nil {
        instance = &Singleton{}
    }
    return instance
}

// Implementasi Pola Singleton dengan inisialisasi antusias
package singleton

type Singleton struct {
}

var instance *Singleton = &Singleton{}

func GetInstance() *Singleton {
    return instance
}

4.2. Masalah Keamanan Benang dalam Pola Singleton

Metode implementasi inisialisasi malas di atas dapat memiliki masalah dalam lingkungan multibenang karena beberapa benang dapat masuk ke kondisi if instance == nil secara bersamaan, yang menyebabkan pembuatan beberapa instance.

4.3. Implementasi Pola Singleton Aman Benang menggunakan sync.Once

Menggunakan sync.Once memastikan bahwa hanya satu goroutine yang menjalankan kode inisialisasi, sehingga menjawab masalah keamanan benang.

// Implementasi Pola Singleton aman benang menggunakan sync.Once
package singleton

import (
    "sync"
)

type Singleton struct {
}

var instance *Singleton
var once sync.Once

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
    })
    return instance
}

4.4. Implementasi Pola Singleton Inisialisasi Malas Aman Benang menggunakan sync.Mutex

Cara lain untuk mengimplementasikan Pola Singleton inisialisasi malas yang aman benang adalah dengan menggunakan sync.Mutex untuk mengunci dan memastikan bahwa hanya satu goroutine yang menjalankan operasi inisialisasi.

// Implementasi Pola Singleton inisialisasi malas aman benang menggunakan sync.Mutex
package singleton

import (
    "sync"
)

type Singleton struct {
}

var instance *Singleton
var mu sync.Mutex

func GetInstance() *Singleton {
    if instance == nil {
        mu.Lock()
        defer mu.Unlock()
        if instance == nil {
            instance = &Singleton{}
        }
    }
    return instance
}