一、 定义
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
二、 示例代码
package org.example.singletonmodel;
/*
* 饿汉式,类一加载,对象就被创建在内存了
* */
public class HungrySingleto {
private static HungrySingleto hs = new HungrySingleto();
private HungrySingleto(){}
public static HungrySingleto getInstance(){
return hs;
}
}
package org.example.singletonmodel;
/*
* 懒汉模式,对象会在用到的时候被加载,对象延迟加载
* 此模式在多线程中会不安全
* */
public class LazySingleton {
private LazySingleton(){}
private static LazySingleton ls = null;
public static LazySingleton getInstance(){
if(ls == null)
ls = new LazySingleton();
return ls;
}
}
package org.example.singletonmodel;
/*
* 懒汉式,线程安全的
*/
public class LazySynSingleton {
private LazySynSingleton(){}
private static LazySynSingleton lss = null;
public static synchronized LazySynSingleton getInstance(){
if(lss == null){
lss = new LazySynSingleton();
}
return lss;
}
}
package org.example.singletonmodel;
/*
* 懒汉式,线程安全高效,当lshs!=null的时候不用判断安全锁,因而高效
* 双锁机制
* */
public class LazySynHSingleton {
private LazySynHSingleton(){}
private static LazySynHSingleton lshs = null;
public static LazySynHSingleton getInstance(){
if (lshs == null){
synchronized (LazySynHSingleton.class){
if(lshs == null)
lshs = new LazySynHSingleton();
}
}
return lshs;
}
}
测试
package org.example.singletonmodel;
public class SingletonModelTest {
public static void main(String[] args) {
HungrySingleto hs1 = HungrySingleto.getInstance();
HungrySingleto hs2 = HungrySingleto.getInstance();
System.out.println(hs1 == hs2);
LazySingleton ls1 = LazySingleton.getInstance();
LazySingleton ls2 = LazySingleton.getInstance();
System.out.println(ls1 == ls2);
LazySynSingleton lss1 = LazySynSingleton.getInstance();
LazySynSingleton lss2 = LazySynSingleton.getInstance();
System.out.println(lss1 == lss2);
LazySynHSingleton lshs1 = LazySynHSingleton.getInstance();
LazySynHSingleton lshs2 = LazySynHSingleton.getInstance();
System.out.println(lshs1 == lshs2);
}
}