单例模式:当整个系统只需要一个实例对象时采用单例模式。
一开始加载类时就new MyClass()是饿汉式,当为null时才new MyClass()是懒汉式
非线程安全:
public class MyClass{
private static MyClass instance;
private MyClass(){
}
public static MyClass getInstance(){
if(instance == null)
instance = new MyClass();
return instance;
}
}
线程安全:
public class MyClass{
private static MyClass instance;
private MyClass(){
}
public static synchronized MyClass getInstance(){
if(instance == null)
instance = new MyClass();
return instance;
}
}
public class MyClass{ //饿汉式
private static MyClass instance = new MyClass(); //类加载时完成初始化,jvm只分配一次,所有实例共享该静态变量
private MyClass(){
}
public static MyClass getInstance(){
return instance;
}
}
public class MyClass{
private volatile static MyClass instance; //保证可见性
private MyClass(){
}
public static MyClass getInstance(){
if(instance == null){
synchronized(MyClass.class){ //对类进行同步,在new MyClass之前再检查一下是否为空
if(instance == null){
instance = new MyClass();
}
}
}
return instance;
}
}
单元素的枚举类型:
public Enum MyClass{
INSTANCE;//定义一个枚举元素,就相当是定义一个MyClass实例
public void printMsg(){
}
}
调用方式:MyClass.INSTANCE.printMsg()
1.5以前的做法是:
public class MyClass{
private static final MyClass instance = new MyClass();
private MyClass(){
}
public static MyClass getInstance(){
return instance;
}
}
对于单例的序列化,除了要implement serializable之外,所有域要声明为transient并提供readResolve方法(from Effective Java)
private Object readResolve(){
return instance;
}