一、单例模式之饿汉式
1.创建SingleModel类
public class SingleModel {
//整个应用程序中只有1个实例
private static SingleModel singleModel = new SingleModel();
//只有自己能创建自己的实例
private SingleModel() {
}
//对外提供获取该实例的方法
public static SingleModel getInstance(){
return singleModel;
}
public void message(){
System.out.println("hello!");
}
}
2.单利测试
public static void main1(String[] args) {
//所有不同对象存储的集合
List<SingleModel> array = new ArrayList<SingleModel>();
//获取单利实例
SingleModel instance1 = SingleModel.getInstance();
array.add(instance1);
for (int i = 0; i <100000 ; i++) {
SingleModel instance2 = SingleModel.getInstance();
if(instance1!=instance2){
array.add(instance2);
}
}
System.out.println(RamUsageEstimator.sizeOf(array));
}
3.结果
96
二、多种单利模式之懒汉式
1.创建 SingleModel1类
//整个应用程序中只有1个实例
private static SingleModel1 singleModel;
//只有自己能创建自己的实例
private SingleModel1() {
}
//对外提供获取该实例的方法(添加了同步锁可以解决线程安全,但是效率会明显的降低获取对象实例)
public static synchronized SingleModel1 getInstance(){
//当singleModel==null,才去实例化
if(singleModel==null){
singleModel = new SingleModel1();
}
return singleModel;
}
public void message(){
System.out.println("hello!");
}
2.创建双重校验锁SingleModel2
采用双锁机制,安全并且在多线程请款保持高性能
public class SingleModel2 {
//整个应用程序中只有1个实例
private static SingleModel2 singleModel;
//只有自己能创建自己的实例
private SingleModel2() {
}
//对外提供获取该实例的方法
public static SingleModel2 getInstance(){
//当singleModel==null,才去实例化
if(singleModel==null){
synchronized (SingleModel2.class){
if(singleModel==null){
singleModel = new SingleModel2();
}
}
}
return singleModel;
}
public void message(){
System.out.println("hello!");
}
}