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
}