पाठ 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;
}
}