本文根据自身的学习和使用,总结出了5种实现Singleton的方法,并对他们的优缺点进行了简单的总结。
第一种:最常用型,代码如下:
public class Singleton1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } private static Singleton1 instance=null; private Singleton1() { } public static synchronized Singleton1 getInstance() { if(instance==null) { instance=new Singleton1(); System.out.println("Thread : "+Thread.currentThread().getName()+" is creating instance!"); } System.out.println("Thread : "+Thread.currentThread().getName()+" getting instance!"); return instance; } }
这种实现,直接对getInstance函数增加了同步关键字,因此可以保证Instance任何情况下,只被创建一次,但是有个问题,就是每次对getInstance的调用都会去试图获取该同步锁,这就增加了程序运行开销,而且,如果第一次调用已经创建了instance之后,则后续的调用实质上已经不需要再去获取同步锁,而只需要判断instance是否为Null即可。因此,这种方法,虽然实现了同步控制,但同步的粒度太大,影响了程序运行的性能。
第二种:对第一种的改造,降低同步粒度
public class Singleton2 { /** * @param args