@HUST-SuWB
2015-02-10T15:21:05.000000Z
字数 1029
阅读 385
读书笔记
出自《剑指Offer》的面试题2,原题题目为:设计一个类,我们只能生成该类的一个实例。
一看到这道题,第一反应是完全没有思路。本来就对设计模式不够熟悉,再加上平常的业务处理中根本不会有涉及到这类需求的问题,因此,从来没有考虑过该如何去实现单例模式。但是,如果静下心来思考的话,生成类的实例必须调用构造方法,那么似乎可以通过私有化构造方法的方式让构造方法对外隔离,剩下的方式就是这唯一的一个实例怎么生成了。如果在类里定义静态的实例,就可以在需要的时候创建该实例。
/**
* 《剑指Offer》面试题2
* @author SuWB
*
*/
public class Singleton {
private Singleton(){}
private static Singleton singleton = null;
public static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
上面的代码是第一反应,但是仔细思考的话,会发现这里面还是有很多问题,其中最显著的问题在于,这段代码只能在单线程的情况下运行,那么,如果考虑多线程的话,要怎么办呢。这时候同步锁就派上用场了。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 《剑指Offer》面试题2
* @author SuWB
* 适用多线程
*/
public class Singleton_Mutiple{
private Singleton_Mutiple(){}
private static Singleton_Mutiple singleton = null;
public static Singleton_Mutiple getSingleton(){
if(singleton == null){
Lock lock = new ReentrantLock();
lock.lock();
try{
if(singleton == null){
singleton = new Singleton_Mutiple();
}
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
return singleton;
}
}
个人觉得能考虑到这个地步已经足够了。