0Pricing
Java Academy · Pelajaran

Singleton: Implementasi Aman bagi Thread

Bangun Singleton yang aman bagi thread menggunakan penguncian pemeriksaan ganda, enum, atau pola holder.

Singleton: Implementasi Aman bagi Thread adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Pola Instans Tunggal

Instans tunggal memastikan bahwa hanya ada satu instans dari sebuah kelas di JVM. Kasus penggunaan umum: pengelola konfigurasi, kumpulan koneksi, dan layanan pencatatan log.

Instans Tunggal Naif — Tidak Aman untuk Utas

Instans tunggal malas klasik gagal saat diakses secara bersamaan: dua utas dapat melewati pemeriksaan null secara bersamaan dan membuat dua instans.

public class Config {
    private static Config instance;
    private Config() {}
    public static Config getInstance() {
        if (instance == null) {              // race condition!
            instance = new Config();
        }
        return instance;
    }
}

Metode Tersinkronisasi — Sederhana tetapi Lambat

Menambahkan synchronized ke getInstance() membuatnya aman untuk utas, tetapi mengunci setiap pemanggilan, bahkan setelah instans tersedia — overhead yang tidak diperlukan.

public static synchronized Config getInstance() {
    if (instance == null) instance = new Config();
    return instance;
}

Penguncian dengan Pemeriksaan Ganda

Lakukan pemeriksaan tanpa kunci, lalu periksa lagi di dalam blok synchronized. Anda harus menggunakan volatile pada bidang tersebut untuk mencegah pengurutan ulang instruksi.

public class Config {
    private static volatile Config instance;
    private Config() {}
    public static Config getInstance() {
        if (instance == null) {
            synchronized (Config.class) {
                if (instance == null) instance = new Config();
            }
        }
        return instance;
    }
}

Inisialisasi Sesuai Permintaan dengan Holder

Instans tunggal malas yang paling aman dan efisien: sebuah kelas bertingkat statis privat menyimpan instansnya. JVM hanya memuatnya saat getInstance() pertama kali dipanggil — pemuatan kelas secara inheren aman untuk utas.

public class Config {
    private Config() {}
    private static final class Holder {
        static final Config INSTANCE = new Config();
    }
    public static Config getInstance() {
        return Holder.INSTANCE;
    }
}

Instans Tunggal Enum

Effective Java merekomendasikan enumerasi dengan satu konstanta. Pendekatan ini ringkas, aman untuk utas, aman dalam serialisasi, dan kebal terhadap serangan refleksi.

public enum AppConfig {
    INSTANCE;
    private String apiUrl = "https://api.example.com";
    public String getApiUrl() { return apiUrl; }
}
// Usage:
String url = AppConfig.INSTANCE.getApiUrl();

Inisialisasi Awal

Jika biaya awal dapat diterima, inisialisasikan instans saat kelas dimuat menggunakan bidang static final. Cara ini sederhana dan aman untuk utas, tetapi instans selalu dibuat meskipun tidak pernah digunakan.

public class Config {
    private static final Config INSTANCE = new Config();
    private Config() {}
    public static Config getInstance() { return INSTANCE; }
}

Instans Tunggal dan Serialisasi

Instans tunggal yang diserialisasi lalu dideserialisasi menghasilkan instans baru kecuali Anda menambahkan readResolve() yang mengembalikan INSTANCE. Pendekatan enumerasi menangani hal ini secara otomatis.

private Object readResolve() { return INSTANCE; }

Instans Tunggal dan Serangan Refleksi

Refleksi dapat memanggil konstruktor privat. Lindungi instans dengan melempar pengecualian dalam konstruktor jika instans sudah ada. Instans tunggal berbasis enumerasi kebal menurut spesifikasi JVM.

private Config() {
    if (Holder.INSTANCE != null) {
        throw new IllegalStateException("Use getInstance()");
    }
}

Instans Tunggal dalam Kerangka Injeksi Dependensi

Dalam Spring, bean secara bawaan merupakan instans tunggal (@Scope("singleton")). Anda jarang perlu menerapkan pola instans tunggal secara manual; biarkan wadah DI yang mengelolanya.

@Component  // Spring manages a single instance
public class FeatureFlags {
    private final boolean darkMode = true;
    public boolean isDarkMode() { return darkMode; }
}

Menguji Instans Tunggal

Instans tunggal sulit diuji dengan pengujian unit karena membawa keadaan global. Lebih baik gunakan injeksi dependensi daripada kode instans tunggal manual; masukkan instans tiruan dalam pengujian melalui injeksi konstruktor.

Pemeriksaan Singkat

Pendekatan instans tunggal apa yang direkomendasikan dalam Effective Java?

Ringkasan

Untuk instans tunggal yang aman bagi utas, gunakan pendekatan Initialization-on-Demand Holder atau enumerasi. Hindari inisialisasi malas yang naif. Dalam aplikasi Spring, biarkan kerangka kerja menangani pengelolaan cakupan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Singleton: Implementasi Aman bagi Thread” gratis?

Ya — teks lengkap “Singleton: Implementasi Aman bagi Thread” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Singleton: Implementasi Aman bagi Thread”?

Bangun Singleton yang aman bagi thread menggunakan penguncian pemeriksaan ganda, enum, atau pola holder. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Singleton: Implementasi Aman bagi Thread” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Singleton: Implementasi Aman bagi Thread
  2. Pola Factory Method
  3. Abstract Factory untuk Keluarga Produk
  4. Pola Builder dengan API Fluent
← Kembali ke Java Academy