पाठ 12 / 38

जावा मेमोरी मॉडल

happens-before संबंध सीखें — एकमात्र गारंटी कि एक थ्रेड दूसरे की लिखाई देखे — और बिना सिंक्रोनाइज़ेशन कोड कम्पाइलर व CPU द्वारा क्यों पुनः क्रमित हो सकता है।

happens-before

JMM लिखाई की दृश्यता की गारंटी तभी देता है जब happens-before संबंध हो: एक ही मॉनिटर unlock→lock, एक ही volatile write→read, Thread.start()/join() आदि।

टूटी double-checked locking

volatile के बिना एक रीडर थ्रेड अधूरे बने instance को देख सकता है क्योंकि JMM कंस्ट्रक्टर व फ़ील्ड लिखाई को पुनः क्रमित कर सकता है। volatile वह happens-before संबंध जोड़ता है।

class Config {
    private static volatile Config instance;   // volatile is required
    static Config get() {
        if (instance == null) {
            synchronized (Config.class) {
                if (instance == null) instance = new Config();
            }
        }
        return instance;
    }
}