1.在何時使用:
在某些情況下,我們只需要一個類只能實例化一個對象,在這種情況下,可以使用單件.
2.uml類圖

Thread 1 調用getInstance() 方法,并且判斷instance是null,然後進入if模塊,在實例化instance之前,Thread 2搶占了Thread 1的cpu。Thread 2 調用getInstance() 方法,并且判斷instance是null,然後進入if模塊,Thread 2 實例化instance 完成,返回Thread 1 再次實例化instance
這個單例已經不在是單例
3).線程安全式單態
/**
* <ul>
* <li>Title:[SingletomB]</li>
* <li>Description: [懶漢式單態]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-24]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class SingletomB
{
private static SingletomB singletom;
private SingletomB()
{}
public static synchronized SingletomB getInstance()
{
if (singletom == null)
{
singletom = new SingletomB();
}
return singletom;
}
}采用同步來解決,這種方式解決了問題,但是仔細分析正常的情況下只有第一次時候,進入對象的實例化,須要同步,其它時候都是直接返回已經實例化好的instance不須要同步,大家都知到在一個多線程的程序中,如果同步的消耗是很大的,很容易造成瓶頸.
4.改進型
利用Double-checked locking 兩次同步,中間變量,解決上邊的問題。
/**
* <ul>
* <li>Title:[SingletomB]</li>
* <li>Description: [懶漢式單態]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-24]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
public class SingletomB
{
private static SingletomB singletom;
private SingletomB()
{}
public static SingletomB getInstance()
{
if (singletom == null)
{
synchronized (SingletomB.class)
{
if (singletom == null)
singletom = new SingletomB();
}
}
return singletom;
}
}
在某些情況下,我們只需要一個類只能實例化一個對象,在這種情況下,可以使用單件.
2.uml類圖

3.使用單例模式的好處.
單類的唯一實例由單件類本控制的,所以可以很好地控制只有一個實現.
使用Singleton的好處還在于可以節省內存因為它限制了實例的個數,有利于Java垃圾回收(garbage collection).
4.例子
1).餓漢式單件,
/**
* <ul>
* <li>Title:[SingletomA]</li>
* <li>Description: [單例]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-24]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
public class SingletomA
{
private static SingletomA singletom = new SingletomA();
private SingletomA()
{}
public static SingletomA getInstance()
{
return singletom;
}
}

2). 懶漢式單件
/**
* <ul>
* <li>Title:[SingletomB]</li>
* <li>Description: [懶漢式單態]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-24]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class SingletomB
{
private static SingletomB singletom;
private SingletomB()
{}
public static SingletomB getInstance()
{
if (singletom == null)
{
singletom = new SingletomB();
}
return singletom;
}
}

這個單例模式是不安全的,為什么說呢 ?因為沒考慮多線程,如下情況單類的唯一實例由單件類本控制的,所以可以很好地控制只有一個實現.
使用Singleton的好處還在于可以節省內存因為它限制了實例的個數,有利于Java垃圾回收(garbage collection).
4.例子
1).餓漢式單件,

























2). 懶漢式單件





























Thread 1 調用getInstance() 方法,并且判斷instance是null,然後進入if模塊,在實例化instance之前,Thread 2搶占了Thread 1的cpu。Thread 2 調用getInstance() 方法,并且判斷instance是null,然後進入if模塊,Thread 2 實例化instance 完成,返回Thread 1 再次實例化instance
這個單例已經不在是單例
3).線程安全式單態




























4.改進型
利用Double-checked locking 兩次同步,中間變量,解決上邊的問題。
































