单例模式可能是代码比较少的一种模式了,但是能把单例模式说清、用好、考虑全面还真不是一件容易的事。本文就对java中单例模式做了一个总结,如有错漏之处,恳请读者指定:
在java编程过程中,单例模式主要分为饿汉式和懒汉式两种
饿汉式:
饿汉式,就是在第一次引用该类的时候就创建对象实例,而不管实际是否需要创建。代码如下:
public class Singleton{
private static Singleton=new Singleton();
private Singleton(){}
public static getSingleton(){
return singleton;
}
}
这样做的好处是编写简单,但是无法做到延迟创建对象。但是我们很多时候都希望对象可以尽可能的延迟加载,减小负载,所有就需要下面的懒汉法:
懒汉法
public class Singleton{
private static Singleton singleton=null;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton==null)
singleton=new Singleton();
return singleton;
}
}
这种写法是最简单的,由私有构造器和一个公有静态工厂方法构成,在工厂方法中对singleton进行null判断,如果是null就new一个出来,最后返回singleton对象。这种方法可以实现延时加载,但是有一个致命弱点:线程不安全。如果有两条线程同时调用getSingleton()方法,就有很大可能导致重复创建对象。
考虑线程安全的写法
public class Singleton{
private static Singleton singleton=null;
private Singleton(){}
public static Singleton getSingleton(){
synchronized(Singleton.class){
if(singleton==null){
singleton=new Singleton();
}
}
return singleton;
}
}