饿汉式:
基本思想:
① 私有构造方法
② 本类中创建自己的对象
③ 提供一个静态方法,返回本类对象的引用
具体代码如下:
class Single
{
private Single(){}
private static Single s = new Single();
public static Single getInstance()
{
return s;
}
}
相对而言,懒汉式要麻烦许多。要考虑到线程的安全问题。而传说中的面试,貌似偏偏就喜欢复杂的。
懒汉式:
基本思想:
① 私有构造方法
② 创建引用型变量,但是,不创建对象
③ 提供公共的静态的方法,先要判断对象是否为空。但是,这里就涉及到一个线程安全问题。假如线程A判断完对象为空。它本应该创建对象,然而就在此时,CPU去执行其他的任务。线程A就停在这里。当线程B来执行这里的时候,它也要判断一下,假如同样的事情又发生了。就会有两个线程卡在哪里。当CPU再一次回来执行线程A的时候,它已经判断完了,程序往下执行,创建对象。然后,线程B回来继续执行的时候,因为它也已经判断过了。那么它也创建一个对象。于是,问题也就出现了,这样便不能保证对象的唯一性。那么,我们就必须在判断完后再加上一把锁。每一次程序进去的时候先判断,再进去拿到对象锁,再创建。哪没有拿到锁的线程,它就不能进去执行。更不能创建对象。
具体代码如下:
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
{
s = new Single();
}
}
}
return s;
}
}