﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-不过而而-随笔分类-Design pattern</title><link>http://www.blogjava.net/lincode/category/33730.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 03 May 2010 10:40:13 GMT</lastBuildDate><pubDate>Mon, 03 May 2010 10:40:13 GMT</pubDate><ttl>60</ttl><item><title>单例模式 Singleton </title><link>http://www.blogjava.net/lincode/archive/2010/04/30/319827.html</link><dc:creator>lincode</dc:creator><author>lincode</author><pubDate>Fri, 30 Apr 2010 13:04:00 GMT</pubDate><guid>http://www.blogjava.net/lincode/archive/2010/04/30/319827.html</guid><wfw:comment>http://www.blogjava.net/lincode/comments/319827.html</wfw:comment><comments>http://www.blogjava.net/lincode/archive/2010/04/30/319827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lincode/comments/commentRss/319827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lincode/services/trackbacks/319827.html</trackback:ping><description><![CDATA[<br />
一 基本概念<br />
单例模式是一种为类 提供唯一实例的设计模式。单例模式的目的是为了控制对象的创建，它可以限制创建的数目为一，但在情况改变的时候，也允许灵活地创建更多的对象。因为只有一个实例，所以也只有一套实例的类变量的拷贝，这很像 static 变量。<br />
<br />
在 JAVA 中，单例模式不应该被当作一种实现全局变量的方法。更多的，如同工厂模式，单例模式允许你通过 确认某些先决条件是否满足 或者 以 lazily 方式按需创建的方式 来封装和控制创建过程。<br />
<br />
二 编程实现<br />
1 饥饿模式 Eager Singleton<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_25_238_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_238_Open_Text.style.display='none'; Codehighlighter1_25_238_Closed_Image.style.display='inline'; Codehighlighter1_25_238_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_25_238_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_238_Closed_Text.style.display='none'; Codehighlighter1_25_238_Open_Image.style.display='inline'; Codehighlighter1_25_238_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MySingleton&nbsp;</span><span id="Codehighlighter1_25_238_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;MySingleton&nbsp;fInstance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MySingleton();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_119_157_Open_Image" onclick="this.style.display='none'; Codehighlighter1_119_157_Open_Text.style.display='none'; Codehighlighter1_119_157_Closed_Image.style.display='inline'; Codehighlighter1_119_157_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_119_157_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_119_157_Closed_Text.style.display='none'; Codehighlighter1_119_157_Open_Image.style.display='inline'; Codehighlighter1_119_157_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;MySingleton()</span><span id="Codehighlighter1_119_157_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Construct&nbsp;object&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_203_235_Open_Image" onclick="this.style.display='none'; Codehighlighter1_203_235_Open_Text.style.display='none'; Codehighlighter1_203_235_Closed_Image.style.display='inline'; Codehighlighter1_203_235_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_203_235_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_203_235_Closed_Text.style.display='none'; Codehighlighter1_203_235_Open_Image.style.display='inline'; Codehighlighter1_203_235_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;MySingleton&nbsp;getInstance()</span><span id="Codehighlighter1_203_235_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reutnr&nbsp;fInstance;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
2 懒汉模式 Lazy Singleton<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_25_319_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_319_Open_Text.style.display='none'; Codehighlighter1_25_319_Closed_Image.style.display='inline'; Codehighlighter1_25_319_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_25_319_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_319_Closed_Text.style.display='none'; Codehighlighter1_25_319_Open_Image.style.display='inline'; Codehighlighter1_25_319_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MySingleton&nbsp;</span><span id="Codehighlighter1_25_319_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;MySingleton&nbsp;fInstance;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_99_136_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_136_Open_Text.style.display='none'; Codehighlighter1_99_136_Closed_Image.style.display='inline'; Codehighlighter1_99_136_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_99_136_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_136_Closed_Text.style.display='none'; Codehighlighter1_99_136_Open_Image.style.display='inline'; Codehighlighter1_99_136_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;MySingleton()</span><span id="Codehighlighter1_99_136_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;construct&nbsp;object</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_199_316_Open_Image" onclick="this.style.display='none'; Codehighlighter1_199_316_Open_Text.style.display='none'; Codehighlighter1_199_316_Closed_Image.style.display='inline'; Codehighlighter1_199_316_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_199_316_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_199_316_Closed_Text.style.display='none'; Codehighlighter1_199_316_Open_Image.style.display='inline'; Codehighlighter1_199_316_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">&nbsp;MySingleton&nbsp;getInstance()</span><span id="Codehighlighter1_199_316_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_231_284_Open_Image" onclick="this.style.display='none'; Codehighlighter1_231_284_Open_Text.style.display='none'; Codehighlighter1_231_284_Closed_Image.style.display='inline'; Codehighlighter1_231_284_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_231_284_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_231_284_Closed_Text.style.display='none'; Codehighlighter1_231_284_Open_Image.style.display='inline'; Codehighlighter1_231_284_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(fInstance&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_231_284_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fInstance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MySingleton();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;fInstance;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
由于只有一个私有构造器，所以单例类是无法被集成的。基于这一点，单例模式并不是一个面向对象模式，仅仅是一个基于对象的模式。<br />
<br />
3 饥饿模式基本没有问题，懒汉模式则容易出现一些错误的编程方法<br />
1) <br />
<code>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&nbsp;error,&nbsp;no&nbsp;synchronization&nbsp;on&nbsp;method&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_80_170_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_170_Open_Text.style.display='none'; Codehighlighter1_80_170_Closed_Image.style.display='inline'; Codehighlighter1_80_170_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_80_170_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_80_170_Closed_Text.style.display='none'; Codehighlighter1_80_170_Open_Image.style.display='inline'; Codehighlighter1_80_170_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;MySingleton&nbsp;getInstance()&nbsp;</span><span id="Codehighlighter1_80_170_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img id="Codehighlighter1_105_146_Open_Image" onclick="this.style.display='none'; Codehighlighter1_105_146_Open_Text.style.display='none'; Codehighlighter1_105_146_Closed_Image.style.display='inline'; Codehighlighter1_105_146_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_105_146_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_105_146_Closed_Text.style.display='none'; Codehighlighter1_105_146_Open_Image.style.display='inline'; Codehighlighter1_105_146_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(fInstance</span><span style="color: #000000">==</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_105_146_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fInstance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MySingleton();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;fInstance;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
</code><br />
2)<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Also&nbsp;an&nbsp;error,&nbsp;synchronization&nbsp;does&nbsp;not&nbsp;prevent&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;two&nbsp;calls&nbsp;of&nbsp;constructor.&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_122_257_Open_Image" onclick="this.style.display='none'; Codehighlighter1_122_257_Open_Text.style.display='none'; Codehighlighter1_122_257_Closed_Image.style.display='inline'; Codehighlighter1_122_257_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_122_257_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_122_257_Closed_Text.style.display='none'; Codehighlighter1_122_257_Open_Image.style.display='inline'; Codehighlighter1_122_257_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;MySingleton&nbsp;getInstance()&nbsp;</span><span id="Codehighlighter1_122_257_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img id="Codehighlighter1_147_234_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_234_Open_Text.style.display='none'; Codehighlighter1_147_234_Closed_Image.style.display='inline'; Codehighlighter1_147_234_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_147_234_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_147_234_Closed_Text.style.display='none'; Codehighlighter1_147_234_Open_Image.style.display='inline'; Codehighlighter1_147_234_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(fInstance</span><span style="color: #000000">==</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_147_234_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img id="Codehighlighter1_186_230_Open_Image" onclick="this.style.display='none'; Codehighlighter1_186_230_Open_Text.style.display='none'; Codehighlighter1_186_230_Closed_Image.style.display='inline'; Codehighlighter1_186_230_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_186_230_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_186_230_Closed_Text.style.display='none'; Codehighlighter1_186_230_Open_Image.style.display='inline'; Codehighlighter1_186_230_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">&nbsp;(MySingleton.</span><span style="color: #0000ff">class</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_186_230_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fInstance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MySingleton();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;fInstance;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;</span></div>
<br />
3) Double-checked locking 不要使用<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_39_225_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_225_Open_Text.style.display='none'; Codehighlighter1_39_225_Closed_Image.style.display='inline'; Codehighlighter1_39_225_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_39_225_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_39_225_Closed_Text.style.display='none'; Codehighlighter1_39_225_Open_Image.style.display='inline'; Codehighlighter1_39_225_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;MySingleton&nbsp;getInstance()</span><span id="Codehighlighter1_39_225_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_68_223_Open_Image" onclick="this.style.display='none'; Codehighlighter1_68_223_Open_Text.style.display='none'; Codehighlighter1_68_223_Closed_Image.style.display='inline'; Codehighlighter1_68_223_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_68_223_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_68_223_Closed_Text.style.display='none'; Codehighlighter1_68_223_Open_Image.style.display='inline'; Codehighlighter1_68_223_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(fInstance&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;)</span><span id="Codehighlighter1_68_223_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_111_217_Open_Image" onclick="this.style.display='none'; Codehighlighter1_111_217_Open_Text.style.display='none'; Codehighlighter1_111_217_Closed_Image.style.display='inline'; Codehighlighter1_111_217_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_111_217_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_111_217_Closed_Text.style.display='none'; Codehighlighter1_111_217_Open_Image.style.display='inline'; Codehighlighter1_111_217_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">&nbsp;(MySingleton.</span><span style="color: #0000ff">class</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_111_217_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_146_207_Open_Image" onclick="this.style.display='none'; Codehighlighter1_146_207_Open_Text.style.display='none'; Codehighlighter1_146_207_Closed_Image.style.display='inline'; Codehighlighter1_146_207_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_146_207_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_146_207_Closed_Text.style.display='none'; Codehighlighter1_146_207_Open_Image.style.display='inline'; Codehighlighter1_146_207_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(fInstance&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_146_207_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fInstance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MySingleton();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
为了避免每次调用 getInstance方法是抓取同步锁的消耗，有人发明了 Double-checked locking 。但不要使用，因为这样的代码将无法在编译器优化和多处理器共享内存的情况下工作。若想详细了解，附录中有对此做详细描述的链接。<br />
<br />
三 总结<br />
<br />
1 单例模式不应被滥用，比如不能为了得到一个全局变量而创建单例，单例是用于控制对象的创建过程的。只有真正的目的是控制对象创建的过程或数量时，才能考虑使用单例。在大部分情况下，单例模式是有代替方案的。比如经典的数据库连接类被以单例实现，其实可以以对象池模式实现。<br />
<br />
2 使用单例模式，尽量使用饥饿模式 ，只有你能预测这个类一定会被创建，那么就可以使用饥饿模式。如果，一定需要推迟对象的创建时间。那么不要使用 Double-checked locking 之类的方法的来提高效率，这将得不偿失。<br />
<br />
[1] DoubleCheckedLocking<br />
<a href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html">http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html</a><br />
<img src ="http://www.blogjava.net/lincode/aggbug/319827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lincode/" target="_blank">lincode</a> 2010-04-30 21:04 <a href="http://www.blogjava.net/lincode/archive/2010/04/30/319827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>