设计模式是一种思想,适合于任何一门面向对象的语言。
单例模式:保证某个类的对象唯一。
设计单例模式思路:
1、其他程序不能声明该类的对象。
2、该类声明了一个本类的实例。
3、对外提供方法让外界获取该对象。
步骤:
1、私有化该类的构造函数。
2、创建一个该类的实例。
3、创建一个方法返回该实例。
具体实现有两种:
饿汉式
public class Single{
private Single() {};
private static Single single= new Single();
public static Single getInstance() {
return single;
}
}
优点:直接声明了一个私有静态实例,static属性只会初始化一次,保证了唯一性。
缺点:不管是否需要调用getInstance(),该类都会初始化一个实例,当不需要该实例时浪费了内存。
懒汉式
public class Single{
private Single() {};
private static Single single;
public static Single getInstance() {
if(single==null)
single=new Single();
return single;
}
}
优点:没有直接声明静态实例,这样就不会造成内存的浪费,同时还能保证唯一性。
缺点:多线程的情况下,懒汉式由于多加了一次判断,没有办法保证对象的唯一性。在实际应用中也是饿汉式用的更多。
懒汉模式如何保证线程安全?
保证线程安全,在Java中用的最多的就是synchronized,进行加锁。
public synchronized static Single getInstance() {
if(single==null)
single=new Single();
return single;
}
上面的代码直接在方法上加锁,效率十分低下,考虑更好的加锁办法。
public static Single getInstance() {
if(single==null) {
synchronized(Single.class) {
if(single==null)
single=new Single();
return single;
}
}
return single;
}
该方法称为双重判空,第一次判空的时候,可能有多个线程的single都为null会进入if语句中,然后将if语句的内容进行加锁,只会有一个线程获得该锁,然后第一个进入的线程,通过第二次判空,创建新的实例,之后获得锁的线程直接返回实例。