# जावा मेमोरी मॉडल — एडवांस्ड जावा

Source: https://www.geekswithgeeks.com/hi/advanced-java/adv-jmm

> 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 संबंध जोड़ता है।

```java
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;
    }
}
```
