﻿<?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-爱生活爱睡觉爱大笑</title><link>http://www.blogjava.net/shenkh/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 21 Jun 2026 14:09:31 GMT</lastBuildDate><pubDate>Sun, 21 Jun 2026 14:09:31 GMT</pubDate><ttl>60</ttl><item><title>几种Singleton模式的java实现</title><link>http://www.blogjava.net/shenkh/articles/237601.html</link><dc:creator>重回疯人院</dc:creator><author>重回疯人院</author><pubDate>Thu, 30 Oct 2008 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/shenkh/articles/237601.html</guid><wfw:comment>http://www.blogjava.net/shenkh/comments/237601.html</wfw:comment><comments>http://www.blogjava.net/shenkh/articles/237601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shenkh/comments/commentRss/237601.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenkh/services/trackbacks/237601.html</trackback:ping><description><![CDATA[<a title="Initialization on demand holder idiom" href="http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom">Initialization on demand holder idiom</a> <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_23_513_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_513_Open_Text.style.display='none'; Codehighlighter1_23_513_Closed_Image.style.display='inline'; Codehighlighter1_23_513_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_23_513_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_23_513_Closed_Text.style.display='none'; Codehighlighter1_23_513_Open_Image.style.display='inline'; Codehighlighter1_23_513_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;Singleton&nbsp;</span><span id="Codehighlighter1_23_513_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_23_513_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Protected&nbsp;constructor&nbsp;is&nbsp;sufficient&nbsp;to&nbsp;suppress&nbsp;unauthorized&nbsp;calls&nbsp;to&nbsp;the&nbsp;constructor</span><span style="color: #008000"><br />
<img id="Codehighlighter1_142_143_Open_Image" onclick="this.style.display='none'; Codehighlighter1_142_143_Open_Text.style.display='none'; Codehighlighter1_142_143_Closed_Image.style.display='inline'; Codehighlighter1_142_143_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_142_143_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_142_143_Closed_Text.style.display='none'; Codehighlighter1_142_143_Open_Image.style.display='inline'; Codehighlighter1_142_143_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Singleton()&nbsp;</span><span id="Codehighlighter1_142_143_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_142_143_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_150_310_Open_Image" onclick="this.style.display='none'; Codehighlighter1_150_310_Open_Text.style.display='none'; Codehighlighter1_150_310_Closed_Image.style.display='inline'; Codehighlighter1_150_310_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_150_310_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_150_310_Closed_Text.style.display='none'; Codehighlighter1_150_310_Open_Image.style.display='inline'; Codehighlighter1_150_310_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_150_310_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_150_310_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;SingletonHolder&nbsp;is&nbsp;loaded&nbsp;on&nbsp;the&nbsp;first&nbsp;execution&nbsp;of&nbsp;Singleton.getInstance()&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;or&nbsp;the&nbsp;first&nbsp;access&nbsp;to&nbsp;SingletonHolder.INSTANCE&nbsp;,&nbsp;not&nbsp;before.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_352_422_Open_Image" onclick="this.style.display='none'; Codehighlighter1_352_422_Open_Text.style.display='none'; Codehighlighter1_352_422_Closed_Image.style.display='inline'; Codehighlighter1_352_422_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_352_422_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_352_422_Closed_Text.style.display='none'; Codehighlighter1_352_422_Open_Image.style.display='inline'; Codehighlighter1_352_422_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">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SingletonHolder&nbsp;</span><span id="Codehighlighter1_352_422_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_352_422_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;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Singleton&nbsp;INSTANCE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Singleton();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_467_510_Open_Image" onclick="this.style.display='none'; Codehighlighter1_467_510_Open_Text.style.display='none'; Codehighlighter1_467_510_Closed_Image.style.display='inline'; Codehighlighter1_467_510_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_467_510_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_467_510_Closed_Text.style.display='none'; Codehighlighter1_467_510_Open_Image.style.display='inline'; Codehighlighter1_467_510_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">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Singleton&nbsp;getInstance()&nbsp;</span><span id="Codehighlighter1_467_510_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_467_510_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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SingletonHolder.INSTANCE;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<span class="mw-headline">Traditional simple way</span><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_23_209_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_209_Open_Text.style.display='none'; Codehighlighter1_23_209_Closed_Image.style.display='inline'; Codehighlighter1_23_209_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_23_209_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_23_209_Closed_Text.style.display='none'; Codehighlighter1_23_209_Open_Image.style.display='inline'; Codehighlighter1_23_209_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;Singleton&nbsp;</span><span id="Codehighlighter1_23_209_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_23_209_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Singleton&nbsp;INSTANCE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Singleton();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Protected&nbsp;constructor&nbsp;is&nbsp;sufficient&nbsp;to&nbsp;suppress&nbsp;unauthorized&nbsp;calls&nbsp;to&nbsp;the&nbsp;constructor</span><span style="color: #008000"><br />
<img id="Codehighlighter1_205_206_Open_Image" onclick="this.style.display='none'; Codehighlighter1_205_206_Open_Text.style.display='none'; Codehighlighter1_205_206_Closed_Image.style.display='inline'; Codehighlighter1_205_206_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_205_206_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_205_206_Closed_Text.style.display='none'; Codehighlighter1_205_206_Open_Image.style.display='inline'; Codehighlighter1_205_206_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Singleton()&nbsp;</span><span id="Codehighlighter1_205_206_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_205_206_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<span class="mw-headline">Java 5 solution</span><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_23_431_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_431_Open_Text.style.display='none'; Codehighlighter1_23_431_Closed_Image.style.display='inline'; Codehighlighter1_23_431_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_23_431_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_23_431_Closed_Text.style.display='none'; Codehighlighter1_23_431_Open_Image.style.display='inline'; Codehighlighter1_23_431_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;Singleton&nbsp;</span><span id="Codehighlighter1_23_431_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_23_431_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;</span><span style="color: #0000ff">volatile</span><span style="color: #000000">&nbsp;Singleton&nbsp;INSTANCE;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Protected&nbsp;constructor&nbsp;is&nbsp;sufficient&nbsp;to&nbsp;suppress&nbsp;unauthorized&nbsp;calls&nbsp;to&nbsp;the&nbsp;constructor</span><span style="color: #008000"><br />
<img id="Codehighlighter1_191_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_191_192_Open_Text.style.display='none'; Codehighlighter1_191_192_Closed_Image.style.display='inline'; Codehighlighter1_191_192_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_191_192_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_191_192_Closed_Text.style.display='none'; Codehighlighter1_191_192_Open_Image.style.display='inline'; Codehighlighter1_191_192_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Singleton()&nbsp;</span><span id="Codehighlighter1_191_192_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_191_192_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_237_429_Open_Image" onclick="this.style.display='none'; Codehighlighter1_237_429_Open_Text.style.display='none'; Codehighlighter1_237_429_Closed_Image.style.display='inline'; Codehighlighter1_237_429_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_237_429_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_237_429_Closed_Text.style.display='none'; Codehighlighter1_237_429_Open_Image.style.display='inline'; Codehighlighter1_237_429_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">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Singleton&nbsp;getInstance()&nbsp;</span><span id="Codehighlighter1_237_429_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_237_429_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_267_401_Open_Image" onclick="this.style.display='none'; Codehighlighter1_267_401_Open_Text.style.display='none'; Codehighlighter1_267_401_Closed_Image.style.display='inline'; Codehighlighter1_267_401_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_267_401_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_267_401_Closed_Text.style.display='none'; Codehighlighter1_267_401_Open_Image.style.display='inline'; Codehighlighter1_267_401_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(INSTANCE&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_267_401_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_267_401_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_308_393_Open_Image" onclick="this.style.display='none'; Codehighlighter1_308_393_Open_Text.style.display='none'; Codehighlighter1_308_393_Closed_Image.style.display='inline'; Codehighlighter1_308_393_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_308_393_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_308_393_Closed_Text.style.display='none'; Codehighlighter1_308_393_Open_Image.style.display='inline'; Codehighlighter1_308_393_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;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">(Singleton.</span><span style="color: #0000ff">class</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_308_393_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_308_393_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;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(INSTANCE&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSTANCE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Singleton();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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;}</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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;INSTANCE;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<a class="external text" title="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html" href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html" rel="nofollow">The "Double-Checked Locking is Broken" Declaration.</a><br />
<br />
<span class="mw-headline">The Enum-way</span><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_22_38_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_38_Open_Text.style.display='none'; Codehighlighter1_22_38_Closed_Image.style.display='inline'; Codehighlighter1_22_38_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_22_38_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_22_38_Closed_Text.style.display='none'; Codehighlighter1_22_38_Open_Image.style.display='inline'; Codehighlighter1_22_38_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">enum</span><span style="color: #000000">&nbsp;Singleton&nbsp;</span><span id="Codehighlighter1_22_38_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_22_38_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;INSTANCE;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/shenkh/aggbug/237601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenkh/" target="_blank">重回疯人院</a> 2008-10-30 14:16 <a href="http://www.blogjava.net/shenkh/articles/237601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转How to set Active Directory Password from Java application</title><link>http://www.blogjava.net/shenkh/articles/237555.html</link><dc:creator>重回疯人院</dc:creator><author>重回疯人院</author><pubDate>Thu, 30 Oct 2008 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/shenkh/articles/237555.html</guid><wfw:comment>http://www.blogjava.net/shenkh/comments/237555.html</wfw:comment><comments>http://www.blogjava.net/shenkh/articles/237555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shenkh/comments/commentRss/237555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenkh/services/trackbacks/237555.html</trackback:ping><description><![CDATA[<h1>How to set Active Directory Password from Java application</h1>
<p>This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at <a href="http://www.microsoft.com/info/cpyright.htm">http://www.microsoft.com/info/cpyright.htm</a></p>
<h2>Business Scenario</h2>
<p>Many Java applications now utilize Active Directory as a source of authentication, in some situations it may be required to set Active Directory password from within Java applications. I encountered a scenario where majority of the users of a Java application were on Active Directory, but for a small percentage of users that do not log-in to Active Directory from their desktops we needed to provide a functionality within the application to set user passwords. </p>
<h2>Prerequisites</h2>
<ul>
    <li>This scenario was only tested against a Windows 2003 Domain
    <li>JKD 1.5.0_03 was used to run the sample code
    <li>You will need to connect to Active Directory with a user account that has permissions to reset passwords
    <li>PKI Certificates used in this scenario were issued by Microsoft Certificate Server configured in Active Directory integrated mode</li>
</ul>
<p>&nbsp;</p>
<h2>Setup SSL trust between Active Directory Domain Controller(s) and Java application</h2>
<p>Active Directory Domain Controllers will only allow password set operations over an SSL channel, therefore both parties should have a common trusted root certificate in their certificate stores. The simplest way to accomplish this is to export a trusted root certificate from a Domain Controller and import it into Java certificate store on the client machine. </p>
<h3>Configuring SSL on Active Directory Domain Controllers</h3>
<p>Active Directory Domain Controllers automatically enroll for domain controller certificate and utilize it for secure LDAP communications if Active Directory integrated&nbsp; Microsoft Certificate Server is deployed within the Forest. So in other words, if you deployed Microsoft Certificate Server in Active Directory integrated mode, then you don't need to do anything else on Active Directory side, all domain controllers will use SSL on port 636.</p>
<p>For instructions on how to setup Microsoft Certificate Server follow this <a href="http://www.microsoft.com/technet/prodtechnol/windowsserver2003/library/ServerHelp/7a2c636a-bf86-479a-8729-d9b005514ee6.mspx">link</a>.</p>
<h3>Importing Trusted Root Certificate on a Java client machine</h3>
<p>On the client side we need to import a mutually trusted root certificate into Java certificate store. In our case we will export the root certificate issued by Microsoft Certificate Server and import it into Java store on the client.</p>
<p>1. On a Domain Controller log-in as an administrator and open Internet Explorer. Go to Tools-&gt;Internet Options-&gt;Content and click on Certificates</p>
<p><img height="446" src="http://alextch.members.winisp.net/resetadpasswordfromjava/IE01.jpg" width="399" border="0"  alt="" /> </p>
<p>2. Switch to Trusted Root Certificate Authorities Tab and Select the certificate issued by your Active Directory integrated Certificate Server. Click on Export</p>
<p><img height="458" src="http://alextch.members.winisp.net/resetadpasswordfromjava/IE02.jpg" width="500" border="0"  alt="" /></p>
<p>3. Choose Base-64 encoded X.509(.CER)</p>
<p><img height="378" src="http://alextch.members.winisp.net/resetadpasswordfromjava/IE03.jpg" width="497" border="0"  alt="" /></p>
<p>4. Specify file name for the exported certificate</p>
<p><img height="382" src="http://alextch.members.winisp.net/resetadpasswordfromjava/IE04.jpg" width="500" border="0"  alt="" /></p>
<p>5. Finish the export and copy the exported .cer file to the Java client machine</p>
<p>6. At the client machine execute the following command. </p>
<p><img height="154" src="http://alextch.members.winisp.net/resetadpasswordfromjava/keytool.jpg" width="641" border="0"  alt="" /></p>
<p>Note the location of the jks file, you will need to reference&nbsp;it later on in the code.</p>
<p>Alias and keystore password are arbitrary values</p>
<h2>Sample program to change Active Directory user password from Java</h2>
<p>&nbsp;</p>
<p>Now that SSL staff is out of the way compile this sample code and run it from the Java client</p>
<p>This code was developed by <a href="http://homepages.ucalgary.ca/~mortis/">Jeremy Mortis</a> here is link to the <a href="http://homepages.ucalgary.ca/~mortis/software/ADConnection.txt">original code</a></p>
<p>import javax.naming.*;<br />
import javax.naming.directory.*;<br />
import javax.naming.ldap.*;<br />
import java.util.*;<br />
import java.security.*;<br />
<br />
public class ADConnection {<br />
<br />
DirContext ldapContext;<br />
String baseName = ",cn=users,DC=fabrikam,DC=com";<br />
String serverIP = "10.1.1.7";<br />
<br />
public ADConnection() {<br />
try {<br />
Hashtable ldapEnv = new Hashtable(11);<br />
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");<br />
ldapEnv.put(Context.PROVIDER_URL, "ldap://" + serverIP + ":636");<br />
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");<br />
ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=administrator" + baseName);<br />
ldapEnv.put(Context.SECURITY_CREDENTIALS, "PA$$w0rd");<br />
ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");<br />
ldapContext = new InitialDirContext(ldapEnv);<br />
}<br />
catch (Exception e) {<br />
System.out.println(" bind error: " + e);<br />
e.printStackTrace();<br />
System.exit(-1);<br />
}<br />
}<br />
<br />
public void updatePassword(String username, String password) {<br />
try {<br />
String quotedPassword = "\"" + password + "\"";<br />
char unicodePwd[] = quotedPassword.toCharArray();<br />
byte pwdArray[] = new byte[unicodePwd.length * 2];<br />
for (int i=0; i&lt;unicodePwd.length; i++) {<br />
pwdArray[i*2 + 1] = (byte) (unicodePwd[i] &gt;&gt;&gt; 8);<br />
pwdArray[i*2 + 0] = (byte) (unicodePwd[i] &amp; 0xff);<br />
}<br />
<br />
ModificationItem[] mods = new ModificationItem[1];<br />
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,<br />
new BasicAttribute("UnicodePwd", pwdArray));<br />
ldapContext.modifyAttributes("cn=" + username + baseName, mods);<br />
}<br />
catch (Exception e) {<br />
System.out.println("update password error: " + e);<br />
System.exit(-1);<br />
}<br />
}<br />
<br />
public static void main(String[] args) {<br />
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());<br />
// the keystore that holds trusted root certificates<br />
System.setProperty("javax.net.ssl.trustStore", "c:\\myCaCerts.jks");<br />
System.setProperty("javax.net.debug", "all");<br />
ADConnection adc = new ADConnection();<br />
adc.updatePassword("Java User2", "pass@word3");<br />
}<br />
}</p>
<img src ="http://www.blogjava.net/shenkh/aggbug/237555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenkh/" target="_blank">重回疯人院</a> 2008-10-30 11:28 <a href="http://www.blogjava.net/shenkh/articles/237555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>