设计模式是一种思想,适合于任何一门面向对象的语言。
单例模式:保证某个类的对象唯一。
设计单例模式思路:
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语句的内容进行加锁,只会有一个线程获得该锁,然后第一个进入的线程,通过第二次判空,创建新的实例,之后获得锁的线程直接返回实例。
本文介绍Java单例模式,其目的是保证类的对象唯一。设计思路包括私有化构造函数、创建本类实例并提供获取方法。具体实现有饿汉式和懒汉式,前者保证唯一但可能浪费内存,后者避免内存浪费但多线程下无法保证唯一。还探讨了懒汉模式保证线程安全的双重判空方法。
2015

被折叠的 条评论
为什么被折叠?



