单例设计模式
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
从定义上来看,显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
所以从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有
的函数用于创建或获取它本身的静态私有对象。
话不多说,单例模式主要有两种,一种是懒汉式,一种是恶汉式,恶汉式相对简单一点,代码如下:
class Single{
private static Single1 single=new Single1();
private Single1(){};
public static Single1 getSingle1Instance(){
return single;
}
}
恶汉式解读:要保证只有一个实例,首先需要构造函数私有化,防止外部直接创建对象,其次我们要写一个方法暴露一个对象出去,由于外部不能创建对象,所以我们写的这个方法需要是静态的,这样外部系统可以使用类名直接调用,当我们把这个方法定义成静态的之后,我们也需要把第一行代码的变量也要定义成静态的,因为静态函数只能访问静态成员!
恶汉式有个缺点,就是不管你有没有用到这个对象,它都在堆中开辟了内存,造成了不必要的浪费!所以有了懒汉式 .。
懒汉式代码如下:
class Single2{
private static Single2 single=null;
private Single2(){};
public static Single2 getSingle1Instance(){
if(single==null){
synchronized(Single2.class){
if(single==null){
single= new Single2();
}
}
}
return single;
}
}
懒汉式解读:因为恶汉式存在线程安全问题,为了保证只有一个实例,所以采用了双重判断的方式。
如果用同步函数的话比较浪费时间,因为每次都要判断锁,所以我们一般不会先去判断锁,如果这对象还没有创
建 那么就先创建,然后返回,当第二个线程来的时候,先看看对象有没有创建,如果有创建,那么会直接返回这个对
象如果没有创建,这个时候在判断有没有获取锁,进行锁的判断,如果可以进入锁,那么就创建对象返回,如果不能
进入锁说明此时有其他的线程正在创建对象,还没有把锁释放掉,所以要等待一会,当其他的线程创建了对象,释放
了锁之后,这个线程才有可能拿到锁,进入之后一看,对象不为空了,那么只有执行最后的return single这条语句
了。
最后总结:考虑方便,在大部分的时候采用恶汉式!