1、概念:单例模式就是保证一个类只存在一个实例为之服务
2、作用:节省内存资源,利于垃圾回收
3、实现:单例模式一般分为两种实现方式
方法一:使用类内部已经new好的实例,代码如下
public class Singleton {
//内部定义实例
private static Singleton obj=new Singleton();
//私有化构造方法,防止外界创建对象
private Singleton(){}
//获取实例
public static Singleton getInstance()
{
return obj;
}
}
方法二:通过判断对象是否存在,不存在的时候创建,代码如下
public class Singleton {
private static Singleton obj;
private static Object lockObj=new Object();
//私有化构造方法,防止外界创建对象
private Singleton(){}
//获取实例
public static Singleton getInstance()
{
//防止多线程模式下创建多个对象
synchronized(lockObj)
{
if(obj==null)
{
//实例不存在则创建
obj=new Singleton();
}
return obj;
}
}
}
4、比较:方法一比方法二更加安全,因为方法一创建的对象是在类加载的时候就创建好了,这样这个类的实例就只有唯一的一个。但对于方法二必须考虑到多线程下不同步造成的创建多个对象的情况。
5、注意的问题:在分布式环境中,单例模式无法达到单例的效果,因为它会被多个类加载器加载,是跨服务器,跨JVM的。比如在使用EJB时需要注意
6、测试:测试看看创建出来的实例是否每次都相同,代码如下
public static void main(String[] args) {
Singleton s=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
if(s==s2)
{
System.out.println("equal");
}
}
输出结果为:equal