??????? singleton ?????????
SingletonPatternDemo.java
public class SingletonPatternDemo {
public static void main(String[] args) {
//????????????
//??????????????? SingleObject() ????????
//SingleObject object = new SingleObject();
//???????????
SingleObject object = SingleObject.getInstance();
//??????
object.showMessage();
}
}
????????????
????Hello World!
????????????????????
????1????????????????
???????????????????????????????????????????????????????????м??? synchronized?????????????????????????????
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
??????δ????????????????????????? lazy loading ????????????????????????????ж???????е??? getInstance() ????????????????????????????2?????????????
?????????????????????????????????????????????????????
????2??????????????
???????????????????????????????? getInstance() ????????????synchronized????
??????????????????????? lazy loading????????????к?????????????Ч?????99% ????2?????????
???????????ε??ò??????????????????
?????????????? synchronized ???????????????????????Ч???
????getInstance() ?????????ó???????????÷?????ò?????????
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
??????????????????????????????????????????????????Ч????????κ?????????????????? getInstance() ??????????????????????????ε??????????????if??????ж? instance ?null??????????null?????????instance???????????δ???????????????????????????????????
????3???????/???У??????DCL???? double-checked locking??
????????????????double checked locking pattern????????????????????????????????????????????????????????μ?? instance == null????????????????????????????????????????????????????Σ??????????ж??????????????????? if??????????????????ж??μ???????????????????
???????????????????????????????????????????????????????
????getInstance() ?????????ó????????
public class Singleton {
private volatile static Singleton singleton;//?????? volatile
private Singleton() {}
public static Singleton getSingleton() {
if (instance == null) {              // Single Checked
synchronized (Singleton.class) {
if (instance == null) {      // Double Checked
instance = new Singleton();
}
}
}
return instance;
}
}
????????????????volatile ??????
??????????volatile ???????????????????????instance = new Singleton()??????????????????????????? JVM ????仰??????????? 3 ?????顣
?????? instance ???????
???????? Singleton ?????????????????????
??????instance??????????????????????? instance ??? null ???
?????????? JVM ???????????д??????????????????????????????????????????????????????????????????? 1-2-3 ??????? 1-3-2??????????????? 3 ???????2 δ?????????????????????? instance ?????? null ????????г???????????????????????? instance?????????????????μ?????
?????????????????? instance ?????????? volatile ???????
??????Щ???????? volatile ?????????????????????????????????? instance ?????????ζ??????????ж??????????????????? volatile ??????????????????????????????????????????????? volatile ?????????????????????????????????????????????????????????????????????????????????????????????????????? 1-2-3 ?????? 1-3-2 ???????????е? 1-3 ????????????????????з????????????????????????? volatile ??????д?????????з??????????????????????????????“????”????????????????
???????????????? Java 5 ?????汾????? volatile ?????????????????????????? Java 5 ????? JMM ??Java ???????????????????????????????? volatile ??????????????????????? volatile ??????????????????????????????? volatile ????????????????? Java 5 ?в?????????????????????????????? volatile??
?????????????????????????????????????????????и????????????????????????
????4???????
?????????????????????????????????????????????????????????????
????????????????????????????????????????
?????????м????????Ч???????
?????????????????????????檔
?????????? classloder ???????????????????????????instance ????????????????????????????????к?????????????д??????????? getInstance ?????? ????????????????????????????????????????????????????????????? instance ?????д? lazy loading ??Ч????
????public class Singleton {
????private static Singleton instance = new Singleton();
????private Singleton (){}
????public static Singleton getInstance() {
????return instance;
????}
????}
????????д??????????????????????????????????????????????????????????????????lazy initialization?????????????????????????????????????????е??? getInstance()??????????????????????Щ?????н??????????? Singleton ?????????????????????????????????? getInstance() ???????????????????ò????????????????????д???????????
????5??????/????????
?????????????????????????????????Ч?????????????????????????????????????????????????????????????????????????????????????????????????????????????á?
??????????????????? classloder ?????????????? instance ????????????????? 4 ?????????????? 4 ?????? Singleton ??????????? instance ???????????д? lazy loading Ч???????????????? Singleton ????????instance ????????????????? SingletonHolder ????б?????????????????????? getInstance ???????????????? SingletonHolder ?????????? instance????????£????????? instance ????????????????????????????????????棬???????? Singleton ??????????????????????? Singleton ???????????????????????????????????????????????? instance ???????????????????????????? 4 ??????ú?????
????public class Singleton {
????private static class SingletonHolder {
????private static final Singleton INSTANCE = new Singleton();
????}
????private Singleton (){}
????public static final Singleton getInstance() {
????return SingletonHolder.INSTANCE;
????}
????}
????????д????????JVM???????????????????????? SingletonHolder ????е?????? getInstance() ?????а????????????????????????????????????????????????????????????????? JDK ?汾??
????6?????Enum
???????????????????????б??????????????????????????????????????????????л???????????????????
???????????? Effective Java ???? Josh Bloch ????????????????????????????????????????????л??????????????л????′????μ??????????????????????????? JDK1.5 ??????? enum ?????????????д????????о????裬?????????У???????á?
??????????? reflection attack ????????й???????
????public enum Singleton {
????INSTANCE;
????public void whateverMethod() {
????}
????}
???????
??????????????????????????????????????????????????????????????????????????
??????????????????????????????????????У????????????????????????????????????????????????緵??????????
????????????????????????д?????????????????????????????????????????????????????????????????????????1??????????????д????
???????????????????£??????????? 1 ???? 2 ??????????????????? 4?????????????????????? lazy loading Ч???????????? 5 ????????????漰???????л??????????????????????? 6 ?????????????????????????????????????? 3 ????????????