1,最简单的实现
首先在类中新建一个私有的构造函数,这样类就不能被实例话了。然后在类中新建一个私有的静态实例,然后提供一个public方法访问该静态方法,这样使用着就可以使用这个类的实例了。
public class SingletonClass{ pirvate static SingletonClass sInstance = new SingletonClass(); public SingletonClass getInstance(){ return sInstance; } private SingletonClass(){ } }
2,性能优化--------Lazy loaded
上例中不管SingletonClass是否使用都会新建一个实例,如果SingletonClass 很耗时,并且可能用不到。代码的变化有两区,一是新建一个实例,赋值为空,知道第一次使用的时候才会赋值。
public class SingletonClass{ private static SingletonClass sInstance = null; public SingletonClass getInstance(){ if(null == sInstance){ sInstance = new SingletonClass(); }
return sInstance; } private SingletonClass(){ } }
3,同步
上述程序在单线程没有问题,当在多线程下,比喻A线程希望使用SingletonClass实例,第一次调用,发现sInstance是空,就新建sInstance实例,就在这个时候CPU发生时间片切换,切换到进程B,B也要使用实例,因为切换发生在A线程检测完后,所以sInstance是空。这时候A和B线程就会新建不同的实例。
public class SingletonClass{ pirvate static SingletonClass sInstance = null; public synchronized SingletonClass getInstance(){ if(null == sInstance){ sInstance = new SingletonClass(); } return sInstance; } private SingletonClass(){} }
需要使用同步锁,一个线程必须等待另一个线程新建完后,才能使用,这样保证了实例的唯一性。
4,又是性能
每次调用实例前,先判断是否为空,如果为空,在同步新建,如果不为空,直接返回,
public class SingletonClass{ private atatic SingletonClass sInstance = null; public SingletonClass getInstance(){ if(null == sInstance){ synchronized(SingletonClass.class){ sInstance = new SingletonClass(); } } return sInstance; } private SingletonClass(){} }