饿汉式(提前创建好):
/*
* 单例模式:饿汉式
* */
public class Singleton {
private static final Singleton single=new Singleton();
public static Singleton getInstance(){
return single;
}
}
关键点:
1.构造方法被定义为private,避免外部调用,这是实现单例对象的关键 2.定义静态变量single,并通过new Singleton()完成初始化,之后不再改变,线程安全 3.外部类可以通过静态方法getInstance()返回单例对象的实例
懒汉式(等到用的时候创建):
/*
* 单例模式: 懒汉式
* */
public class Singleton2 {
private static Singleton2 single =null;
private Singleton2(){}
public static Singleton2 getInstance(){
if (single==null){
single=new Singleton2();
}
return single;
}
}
以上存在线程安全问题,可修改如下:
public static synchronized Singleton2 getInstance(){
if(single==null){
single=new Singleton2();
}
return single;
}
以上代码还可以再优化,调高运行效率:
public static Singleton2 getInstance(){
if(single==null){
synchronized(Singleton2.class){
if(single==null){
single=new Singleton2();
}
return single;
}
}
}
如上代码,为双重锁校验,完整如下:
public class Singleton3 {
private volatile static Singleton3 single;
private Singleton3 (){}
public static Singleton3 getInstance() {
if (single == null) {
synchronized (Singleton3.class) {
if (single == null) {
single = new Singleton3();
}
}
}
return single;
}
}
静态内部类方式:
public class Singleton4 {
private static class innerClass{
private static Singleton4 single =new Singleton4();
}
private Singleton4(){}
public static final Singleton4 getInstance(){
return innerClass.single;
}
}
枚举方式: