单例模式咱们在开发中常常用到,可是咱们可能熟知一种单例模式,可是单例模式也有好多种,如今就对几种单例模式作个比较,明白其中的优缺点:设计模式
public class Singleton{ private static Singleton single=new Singleton(); private Singleton(){ System.out.println("生成一个Singleton实例"); } public static Singleton getInstance(){ return single; } }
2.测试代码安全
public class SingletonTest{ public static void main(String[] args){ System.out.println("Start..."); Singleton single1=Singleton.getInstance(); Singleton single2=Singleton.getInstance(); if(single1==single2){ System.out.println("obj1 和 obj2 是相同的实例。"); }else{ System.out.println("obj1 和 obj2 是不一样的实例。"); } System.out.println("End..."); } }
3.测试结果网络
Start...
生成一个Singleton实例
obj1 和 obj2 是相同的实例。
End...多线程
public class Singleton{ private static Singleton single=null; private Singleton(){ System.out.println("生成一个Singleton实例"); } public static Singleton getInstance(){ if(single==null){ single=new Singleton(); } return single; } }
5.不是严格单例模式测试代码ide
public class SingletonThread implements Runnable { private Set<Singleton> set=new HashSet<Singleton>(); @Override public void run() { Singleton single=Singleton.getInstance(); set.add(single); System.out.println("Set的大小为:"+set.size()+","+set); } }
测试类Main方法函数
public class SingleTest { public static void main(String[] args) { SingletonThread t=new SingletonThread(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); } }
6.测试结果:会看到会有多个“生成一个Singleton实例”,说明调用了5次 new Singleton()方法。测试
7.若是使用第一种方法的话:只会有一个“生成一个Singleton实例 ”,说明只调用了一次 new Singleton() 方法。线程
8.为了解决第二种多线程安全问题,采用对函数进行同步的方式,可是也比较浪费资源,由于每次都要进行同步检查,而实际真正须要检查的只是第一次。(单例模式的第三个版本)设计
public class Singleton{ private static Singleton single=null; private Singleton(){ System.out.println("生成一个Singleton实例"); } public static synchronized Singleton getInstance(){ if(single==null){ single=new Singleton(); } return single; } }
运行结果:3d
9.(单例模式的第四个版本)既解决了“懒汉式”多线程的安全问题,又解决了浪费资源的现象。
public class Singleton{ private static Singleton single; private Singleton(){ System.out.println("生成一个Singleton实例"); } public static Singleton getInstance(){ if(single==null){ synchronized(Singleton.class) { if(single==null) { single=new Singleton(); } } } return single; } }
运行结果:
10.单例模式优缺点总结:
优势:客户端使用单例模式的实例的时候,只须要调用一个单一的方法就能够获得一个惟一的实例,有利于节省资源。缺点:首先单例模式很难实现实例化,这就致使采用单例模式的类很难被持久化,固然也很难经过网络进行传输;其次,因为单例采用静态方法,没法再继承结构中使用。