﻿<?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-奇葛格的BLOG-随笔分类-技术新闻.乱评</title><link>http://www.blogjava.net/onlykeke/category/13503.html</link><description>红尘最可笑，我自乐逍遥</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 07:11:08 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 07:11:08 GMT</pubDate><ttl>60</ttl><item><title>java  aio [转]</title><link>http://www.blogjava.net/onlykeke/archive/2006/11/21/82592.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Tue, 21 Nov 2006 11:11:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/11/21/82592.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/82592.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/11/21/82592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/82592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/82592.html</trackback:ping><description><![CDATA[		转自：http://www.blogjava.net/jobs/archive/2006/11/21/82409.html
		<h2>回顾一下Unix的5种I/O模型</h2>
		1、阻塞I/O<br />2、非阻塞I/O<br />3、I/O复用（select、poll、linux 2.6种改进的epoll）<br />4、信号驱动IO（SIGIO）<br />5、异步I/O（POSIX的aio_系列函数）<br /><h2>同步I/O和异步IO</h2>POSIX把这两个术语定义如下：<br /><p>同步I/O操作导致请求进程阻塞，直至操作完成<br />异步I/O操作不导致请求阻塞。<br /><br />根据上述定义，前四种I/O模型都是同步I/O，第5种才是异步I/O。<br /><br />select不允许多于一个的线程在同一个描述符集上等待。这使得反应式模型不适用于高性能应用，因为它没有有效地利用硬件的并行性。<br />异步I/O通常能够提高更好的性能，windows的iocp通过内核线程调度，也能提供很好的并发性能，但不是真正的异步。<br /></p><h2>Java nio和多路复用</h2><br />java
1.4 nio提供的select，这是一种多路复用I/O（multiplexed non-blocking
I/O）模型，底层是使用select或者poll。I/O复用就是，阻塞在select或者poll系统调用的某一个之上，而不是阻塞在真正的I/O系
统调用之上。JDK 5.0 update 9和JDK 6.0在linux下支持使用epoll，可以提高并发idle connection的性能（<a href="http://blogs.sun.com/alanb/entry/epoll">http://blogs.sun.com/alanb/entry/epoll</a>）。<br /><br />以前看到有人猜测Windows下nio使用了IOCP，那应该是错的，毕竟IOCP不是多路复用I/O模型。从JavaOne 2006的幻灯片来看，aio才会使用IOCP来实现的。<br /><h2>Java aio和JSR 203</h2><br />2003年，就有了JSR 203（<u><font color="#0000ff">http://jcp.org/en/jsr/detail?id=203</font></u>），但是一直没有实现。<br /><br />终于，JSR 203的spec lead说，将会在Java SE 7.0中完成JSR 203，Java SE 6.0已经是RC，很快正式版就会发布，然后就是Java SE 7.0，估计我们不需要等太久了。<a href="http://blogs.sun.com/alanb/entry/what_is_happening_with_jsr"><br />http://blogs.sun.com/alanb/entry/what_is_happening_with_jsr</a><br /><br />asynchronous
I/O对于Java的影响，将不会低于当年JDK 1.4 nio引入multiplexed non-blocking
I/O的影响，很多的Java应用都会重写。如同Linux
2.6支持AIO，DB2、Oracle数据库都会发布新版本，说支持使用AIO，性能提高多少多少云云（主要是AIO的文件操作部分）。<br /><br />对asynchronous I/O的支持，Java程序就能够支撑大并发网络应用了，在IO模型方面，对于C/C++等语言不再存在“C/C++能做，但是Java不能做的事情”。<br /><br />这个是Java One 2006上的幻灯片。<br /><a href="http://blogs.sun.com/roller/resources/alanb/bof0895.pdf">http://blogs.sun.com/roller/resources/alanb/bof0895.pdf</a><br />提到了：<br />需要新的channel types支持异步I/O模型<br />使用Native机制，例如Windows IO Completion ports。<br /><br /><b>[附]</b><br />JDK 6.0 nio支持epoll，对并发idle connection会有大幅度的性能提升，这就是很多网络服务器应用程序需要的。<br /><br />One of the updates in build 59 of 
<a href="https://mustang.dev.java.net/">Mustang</a> 
(Java<sup><font size="-1">TM</font></sup> SE 6) 
is that the New I/O
<a href="http://download.java.net/jdk6/docs/api/java/nio/channels/Selector.html">Selector</a>
implementation will use the
<a href="http://www.die.net/doc/linux/man/man4/epoll.4.html">epoll</a> event notification 
facility when running on the Linux 2.6 kernel.<br /><br />JDK 5.0 update 9也支持：<br />The epoll SelectorProvider will be included in 5.0 update 9. To enable
it requires setting the system property
<font color="#0000ff"><b>java.nio.channels.spi.SelectorProvider to the value
sun.nio.ch.EPollSelectorProvider.</b></font><br /><br />5种IO模型：<br />阻塞IO<br />非阻塞IO<br />多路复用<br />信号驱动IO<br />异步IO<br /><br />最好性能的还是异步IO，目前Java只能支持到多路复用一级，期待着以后Java 7.0/8.0支持异步IO，6.0是没有希望了。<br /><img src ="http://www.blogjava.net/onlykeke/aggbug/82592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-11-21 19:11 <a href="http://www.blogjava.net/onlykeke/archive/2006/11/21/82592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>技术文章链接</title><link>http://www.blogjava.net/onlykeke/archive/2006/09/24/71552.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Sun, 24 Sep 2006 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/09/24/71552.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/71552.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/09/24/71552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/71552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/71552.html</trackback:ping><description><![CDATA[
		<u>
				<font color="#0000ff">C语言高效编程的四大绝招  </font>
		</u>
		<a href="http://blog.csdn.net/nhczp/archive/2006/09/22/1264355.aspx">http://blog.csdn.net/nhczp/archive/2006/09/22/1264355.aspx</a>
		<br />
		<br />
		<span class="ts">
				<a href="http://www.artima.com/forums/flat.jsp?forum=276&amp;thread=151519">Does Wicket Suit Your Web Framework Style?</a>
		</span>
		<br />
		<span class="blogEntryTitle">
				<a title="http://javageek.org/2006/03/08/comparing_web_frameworks_wicket.html" href="http://javageek.org/2006/03/08/comparing_web_frameworks_wicket.html" name="a1141831685192">
						<font color="#000000">Comparing Web Frameworks: Wicket</font>
				</a>  </span>
		<a href="http://javageek.org/2006/03/08/comparing_web_frameworks_wicket.html">http://javageek.org/2006/03/08/comparing_web_frameworks_wicket.html</a>
<img src ="http://www.blogjava.net/onlykeke/aggbug/71552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-09-24 13:06 <a href="http://www.blogjava.net/onlykeke/archive/2006/09/24/71552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单例模式陷阱[转]</title><link>http://www.blogjava.net/onlykeke/archive/2006/09/14/69537.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Thu, 14 Sep 2006 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/09/14/69537.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/69537.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/09/14/69537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/69537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/69537.html</trackback:ping><description><![CDATA[
		<div class="post">
				<div class="posthead">
						<h2>
								<a class="singleposttitle" id="viewpost1_TitleUrl" href="/JavaExplore/archive/2006/08/26/65914.html">
										<font color="#223355">单例模式陷阱</font>
								</a>
						</h2>Posted on 2006-08-26 11:26 <a href="/JavaExplore/"><font color="#223355">JavaExplore</font></a><!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://www.blogjava.net/JavaExplore/archive/2006/08/26/65914.html"
dc:identifier="http://www.blogjava.net/JavaExplore/archive/2006/08/26/65914.html"
dc:title="【原创】单例模式陷阱"
trackback:ping="http://www.blogjava.net/JavaExplore/services/trackbacks/65914.aspx" />
</rdf:RDF>
--></div>
				<div class="postbody">
						<p>         今天去jdon，看了它的设计研究栏目，bang有几篇评论单例模式的文章，声称“Singleton is evil”（见<a href="http://www.jdon.com/jive/article.jsp?forum=91&amp;thread=17578"><font color="#1d58d1">http://www.jdon.com/jive/article.jsp?forum=91&amp;thread=17578</font></a>），并且引用几篇外文页面佐证自己的观点，其中有一篇文章更是说，单例不仅不是一种模式，而是一种反模式。<br />        下面我谈谈我对单例模式的看法。逐一分析单例模式的陷阱，帮助大家正确使用单例模式。<br />（1） 陷阱一：调用函数的性能瓶颈<br />        在c++中，单例只有一种实现方式——LazySingleton, 实现如下(本文全部使用java代码)：</p>
						<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_26_249_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_249_Open_Text.style.display='none'; Codehighlighter1_26_249_Closed_Image.style.display='inline'; Codehighlighter1_26_249_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
								<img id="Codehighlighter1_26_249_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_249_Closed_Text.style.display='none'; Codehighlighter1_26_249_Open_Image.style.display='inline'; Codehighlighter1_26_249_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">class</span>
								<span style="COLOR: #000000"> LazySingleton</span>
								<span id="Codehighlighter1_26_249_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">
								</span>
								<span id="Codehighlighter1_26_249_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
										<span style="COLOR: #0000ff">private</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">static</span>
										<span style="COLOR: #000000"> LazySingleton m_instance</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #0000ff">null</span>
										<span style="COLOR: #000000">;<br /><img id="Codehighlighter1_106_107_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_107_Open_Text.style.display='none'; Codehighlighter1_106_107_Closed_Image.style.display='inline'; Codehighlighter1_106_107_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_106_107_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_106_107_Closed_Text.style.display='none'; Codehighlighter1_106_107_Open_Image.style.display='inline'; Codehighlighter1_106_107_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span>     <span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> LazySingleton()</span><span id="Codehighlighter1_106_107_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"></span><span id="Codehighlighter1_106_107_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_165_247_Open_Image" onclick="this.style.display='none'; Codehighlighter1_165_247_Open_Text.style.display='none'; Codehighlighter1_165_247_Closed_Image.style.display='inline'; Codehighlighter1_165_247_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_165_247_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_165_247_Closed_Text.style.display='none'; Codehighlighter1_165_247_Open_Image.style.display='inline'; Codehighlighter1_165_247_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span>     <span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> LazySingleton getInstance()</span><span id="Codehighlighter1_165_247_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"></span><span id="Codehighlighter1_165_247_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_instance</span><span style="COLOR: #000000">!=</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            m_instance</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> LazySingleton();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> m_instance;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span>
						</div>
						<p>LazySingleton将对象的初始化推迟到调用的时候。并且为了防止多线程环境下产生多个实例，使用synchronized关键字保证函数getInstance调用的线程安全。synchronized关键字的存在保证了只会产生一个对象，但也成了多线程环境下的性能瓶颈。一个多线程的程序，到了这里却要排队等候成了一个单线程式的执行流程，这在高并发环境下是不可容忍的。而c++中可以使用双重检查机制将这种性能问题仅仅限制在第一次构造对象的时候，而java中不可以使用双重检查机制。<br />        但是java可以实现EagerSingleton，实现如下：</p>
						<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_27_197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_197_Open_Text.style.display='none'; Codehighlighter1_27_197_Closed_Image.style.display='inline'; Codehighlighter1_27_197_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
								<img id="Codehighlighter1_27_197_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_197_Closed_Text.style.display='none'; Codehighlighter1_27_197_Open_Image.style.display='inline'; Codehighlighter1_27_197_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">class</span>
								<span style="COLOR: #000000"> EagerSingleton</span>
								<span id="Codehighlighter1_27_197_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">
								</span>
								<span id="Codehighlighter1_27_197_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
										<span style="COLOR: #0000ff">private</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">static</span>
										<span style="COLOR: #000000"> EagerSingleton m_instance</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> EagerSingleton();<br /><img id="Codehighlighter1_125_126_Open_Image" onclick="this.style.display='none'; Codehighlighter1_125_126_Open_Text.style.display='none'; Codehighlighter1_125_126_Closed_Image.style.display='inline'; Codehighlighter1_125_126_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_125_126_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_126_Closed_Text.style.display='none'; Codehighlighter1_125_126_Open_Image.style.display='inline'; Codehighlighter1_125_126_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span>     <span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> EagerSingleton()</span><span id="Codehighlighter1_125_126_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"></span><span id="Codehighlighter1_125_126_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_171_195_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_195_Open_Text.style.display='none'; Codehighlighter1_171_195_Closed_Image.style.display='inline'; Codehighlighter1_171_195_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_171_195_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_195_Closed_Text.style.display='none'; Codehighlighter1_171_195_Open_Image.style.display='inline'; Codehighlighter1_171_195_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span>     <span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> agerSingleton getInstance()</span><span id="Codehighlighter1_171_195_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"></span><span id="Codehighlighter1_171_195_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> m_instance;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span>
						</div>与LazySingleton相比，EagerSingleton将对象的初始化放到了类加载的时候。这样就避免了synchronized关键字的性能瓶颈。<br />（2）陷阱二：访问互斥共享资源<br />         EagerSingleton中访问互斥资源也要考虑线程安全问题。下面看一个例子：<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_27_347_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_347_Open_Text.style.display='none'; Codehighlighter1_27_347_Closed_Image.style.display='inline'; Codehighlighter1_27_347_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_347_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_347_Closed_Text.style.display='none'; Codehighlighter1_27_347_Open_Image.style.display='inline'; Codehighlighter1_27_347_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> EagerSingleton</span><span id="Codehighlighter1_27_347_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"></span><span id="Codehighlighter1_27_347_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> EagerSingleton m_instance</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> EagerSingleton();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> HashMap map</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap();<br /><img id="Codehighlighter1_154_155_Open_Image" onclick="this.style.display='none'; Codehighlighter1_154_155_Open_Text.style.display='none'; Codehighlighter1_154_155_Closed_Image.style.display='inline'; Codehighlighter1_154_155_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_154_155_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_155_Closed_Text.style.display='none'; Codehighlighter1_154_155_Open_Image.style.display='inline'; Codehighlighter1_154_155_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> EagerSingleton()</span><span id="Codehighlighter1_154_155_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"></span><span id="Codehighlighter1_154_155_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_200_224_Open_Image" onclick="this.style.display='none'; Codehighlighter1_200_224_Open_Text.style.display='none'; Codehighlighter1_200_224_Closed_Image.style.display='inline'; Codehighlighter1_200_224_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_200_224_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_200_224_Closed_Text.style.display='none'; Codehighlighter1_200_224_Open_Image.style.display='inline'; Codehighlighter1_200_224_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> agerSingleton getInstance()</span><span id="Codehighlighter1_200_224_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"></span><span id="Codehighlighter1_200_224_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> m_instance;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_251_345_Open_Image" onclick="this.style.display='none'; Codehighlighter1_251_345_Open_Text.style.display='none'; Codehighlighter1_251_345_Closed_Image.style.display='inline'; Codehighlighter1_251_345_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_251_345_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_251_345_Closed_Text.style.display='none'; Codehighlighter1_251_345_Open_Image.style.display='inline'; Codehighlighter1_251_345_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> refreshMap(Object key)</span><span id="Codehighlighter1_251_345_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"></span><span id="Codehighlighter1_251_345_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_272_341_Open_Image" onclick="this.style.display='none'; Codehighlighter1_272_341_Open_Text.style.display='none'; Codehighlighter1_272_341_Closed_Image.style.display='inline'; Codehighlighter1_272_341_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_272_341_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_272_341_Closed_Text.style.display='none'; Codehighlighter1_272_341_Open_Image.style.display='inline'; Codehighlighter1_272_341_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000">(map)</span><span id="Codehighlighter1_272_341_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"></span><span id="Codehighlighter1_272_341_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">map.contains(key))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                map.put(key,value);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">value为此时的实时数据</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">        }</span></span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>因为该类是单例，可能多线程并发访问map，map非线程安全，需要加线程安全关键字，否则就掉入了访问互斥资源的陷阱。<br />（3）陷阱三：非法逻辑陷阱<br />        这种情况一般是滥用单例模式造成的，下面考虑一种滥用单例的情况。下面的代码的作用是getValueByName后,马上printValue即完成操作流程。<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_27_386_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_386_Open_Text.style.display='none'; Codehighlighter1_27_386_Closed_Image.style.display='inline'; Codehighlighter1_27_386_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_386_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_386_Closed_Text.style.display='none'; Codehighlighter1_27_386_Open_Image.style.display='inline'; Codehighlighter1_27_386_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> EagerSingleton</span><span id="Codehighlighter1_27_386_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"></span><span id="Codehighlighter1_27_386_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> EagerSingleton m_instance</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> EagerSingleton();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> String value</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_153_154_Open_Image" onclick="this.style.display='none'; Codehighlighter1_153_154_Open_Text.style.display='none'; Codehighlighter1_153_154_Closed_Image.style.display='inline'; Codehighlighter1_153_154_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_153_154_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_153_154_Closed_Text.style.display='none'; Codehighlighter1_153_154_Open_Image.style.display='inline'; Codehighlighter1_153_154_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> EagerSingleton()</span><span id="Codehighlighter1_153_154_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"></span><span id="Codehighlighter1_153_154_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_199_223_Open_Image" onclick="this.style.display='none'; Codehighlighter1_199_223_Open_Text.style.display='none'; Codehighlighter1_199_223_Closed_Image.style.display='inline'; Codehighlighter1_199_223_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_199_223_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_199_223_Closed_Text.style.display='none'; Codehighlighter1_199_223_Open_Image.style.display='inline'; Codehighlighter1_199_223_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> agerSingleton getInstance()</span><span id="Codehighlighter1_199_223_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"></span><span id="Codehighlighter1_199_223_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> m_instance;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_278_321_Open_Image" onclick="this.style.display='none'; Codehighlighter1_278_321_Open_Text.style.display='none'; Codehighlighter1_278_321_Closed_Image.style.display='inline'; Codehighlighter1_278_321_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_278_321_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_278_321_Closed_Text.style.display='none'; Codehighlighter1_278_321_Open_Image.style.display='inline'; Codehighlighter1_278_321_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> getValueByName(String name)</span><span id="Codehighlighter1_278_321_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"></span><span id="Codehighlighter1_278_321_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">getByNameFromDateBase(name);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_348_384_Open_Image" onclick="this.style.display='none'; Codehighlighter1_348_384_Open_Text.style.display='none'; Codehighlighter1_348_384_Closed_Image.style.display='inline'; Codehighlighter1_348_384_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_348_384_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_348_384_Closed_Text.style.display='none'; Codehighlighter1_348_384_Open_Image.style.display='inline'; Codehighlighter1_348_384_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> viod printValue()</span><span id="Codehighlighter1_348_384_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"></span><span id="Codehighlighter1_348_384_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.vaue);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p>该类含有一私有属性value，在多线程环境下不能保证value值的合理逻辑，一线程getValueByName后,马上printValue，也有可能value的值已经被其他线程修改。这种情况就属于单例模式的滥用，该类根本不适合做成单例。<br />        消除非法逻辑的陷阱，可以通过将该类重构为纯粹的行为类完成。重构后的代码如下：</p><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_27_399_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_399_Open_Text.style.display='none'; Codehighlighter1_27_399_Closed_Image.style.display='inline'; Codehighlighter1_27_399_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_399_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_399_Closed_Text.style.display='none'; Codehighlighter1_27_399_Open_Image.style.display='inline'; Codehighlighter1_27_399_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> EagerSingleton</span><span id="Codehighlighter1_27_399_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"></span><span id="Codehighlighter1_27_399_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> EagerSingleton m_instance</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> EagerSingleton();<br /><img id="Codehighlighter1_125_126_Open_Image" onclick="this.style.display='none'; Codehighlighter1_125_126_Open_Text.style.display='none'; Codehighlighter1_125_126_Closed_Image.style.display='inline'; Codehighlighter1_125_126_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_125_126_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_126_Closed_Text.style.display='none'; Codehighlighter1_125_126_Open_Image.style.display='inline'; Codehighlighter1_125_126_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> EagerSingleton()</span><span id="Codehighlighter1_125_126_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"></span><span id="Codehighlighter1_125_126_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_171_195_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_195_Open_Text.style.display='none'; Codehighlighter1_171_195_Closed_Image.style.display='inline'; Codehighlighter1_171_195_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_171_195_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_195_Closed_Text.style.display='none'; Codehighlighter1_171_195_Open_Image.style.display='inline'; Codehighlighter1_171_195_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> agerSingleton getInstance()</span><span id="Codehighlighter1_171_195_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"></span><span id="Codehighlighter1_171_195_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> m_instance;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_240_284_Open_Image" onclick="this.style.display='none'; Codehighlighter1_240_284_Open_Text.style.display='none'; Codehighlighter1_240_284_Closed_Image.style.display='inline'; Codehighlighter1_240_284_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_240_284_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_240_284_Closed_Text.style.display='none'; Codehighlighter1_240_284_Open_Image.style.display='inline'; Codehighlighter1_240_284_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> String getValueByName(String name)</span><span id="Codehighlighter1_240_284_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"></span><span id="Codehighlighter1_240_284_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> getByNameFromDateBase(name);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_321_397_Open_Image" onclick="this.style.display='none'; Codehighlighter1_321_397_Open_Text.style.display='none'; Codehighlighter1_321_397_Closed_Image.style.display='inline'; Codehighlighter1_321_397_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_321_397_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_321_397_Closed_Text.style.display='none'; Codehighlighter1_321_397_Open_Image.style.display='inline'; Codehighlighter1_321_397_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> viod printName(String name)</span><span id="Codehighlighter1_321_397_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"></span><span id="Codehighlighter1_321_397_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">getValueByName(String name);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(value);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p>通过调用printName(String name)直接完成操作流程，将其中的私有属性处理成过程式的参数传递，将该类修改成纯粹的行为类。</p><p>        含有私有属性并且含有对它赋值操作的类并非都会调入该陷阱，构造函数里进行对私有属性赋值不会引起非法逻辑，如下代码</p><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_27_267_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_267_Open_Text.style.display='none'; Codehighlighter1_27_267_Closed_Image.style.display='inline'; Codehighlighter1_27_267_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_267_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_267_Closed_Text.style.display='none'; Codehighlighter1_27_267_Open_Image.style.display='inline'; Codehighlighter1_27_267_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> EagerSingleton</span><span id="Codehighlighter1_27_267_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"></span><span id="Codehighlighter1_27_267_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> EagerSingleton m_instance</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> EagerSingleton();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> HashMap map</span><span style="COLOR: #000000">==</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_157_197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_157_197_Open_Text.style.display='none'; Codehighlighter1_157_197_Closed_Image.style.display='inline'; Codehighlighter1_157_197_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_157_197_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_157_197_Closed_Text.style.display='none'; Codehighlighter1_157_197_Open_Image.style.display='inline'; Codehighlighter1_157_197_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    <span style="COLOR: #0000ff">private</span></span><span style="COLOR: #000000"> EagerSingleton()</span><span id="Codehighlighter1_157_197_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"></span><span id="Codehighlighter1_157_197_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        map.put(key,value);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">value为此时的实时数据</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_241_265_Open_Image" onclick="this.style.display='none'; Codehighlighter1_241_265_Open_Text.style.display='none'; Codehighlighter1_241_265_Closed_Image.style.display='inline'; Codehighlighter1_241_265_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_241_265_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_241_265_Closed_Text.style.display='none'; Codehighlighter1_241_265_Open_Image.style.display='inline'; Codehighlighter1_241_265_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> agerSingleton getInstance()</span><span id="Codehighlighter1_241_265_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"></span><span id="Codehighlighter1_241_265_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> m_instance;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p>构造函数里不必要加线程安全关键字也可以保证线程安全，因为类加载器是线程安全的，EagerSingleton只会在类加载的时候实例化一次，这样不会出现单例模式的线程不安全，也不会造成非法逻辑。<br />（4）陷阱四：单例陷阱的传递<br />        当含有对象作为单例类的私有属性时，陷阱不仅会出现在该类本身，还会传递到私有对象所在的类中。看如下代码：</p><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_27_395_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_395_Open_Text.style.display='none'; Codehighlighter1_27_395_Closed_Image.style.display='inline'; Codehighlighter1_27_395_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_395_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_395_Closed_Text.style.display='none'; Codehighlighter1_27_395_Open_Image.style.display='inline'; Codehighlighter1_27_395_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> EagerSingleton</span><span id="Codehighlighter1_27_395_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"></span><span id="Codehighlighter1_27_395_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> EagerSingleton m_instance</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> EagerSingleton();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> NewClass newClass</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">nll;<br /><img id="Codehighlighter1_157_187_Open_Image" onclick="this.style.display='none'; Codehighlighter1_157_187_Open_Text.style.display='none'; Codehighlighter1_157_187_Closed_Image.style.display='inline'; Codehighlighter1_157_187_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_157_187_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_157_187_Closed_Text.style.display='none'; Codehighlighter1_157_187_Open_Image.style.display='inline'; Codehighlighter1_157_187_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> EagerSingleton()</span><span id="Codehighlighter1_157_187_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"></span><span id="Codehighlighter1_157_187_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        newClass</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> NewClass();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_232_256_Open_Image" onclick="this.style.display='none'; Codehighlighter1_232_256_Open_Text.style.display='none'; Codehighlighter1_232_256_Closed_Image.style.display='inline'; Codehighlighter1_232_256_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_232_256_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_232_256_Closed_Text.style.display='none'; Codehighlighter1_232_256_Open_Image.style.display='inline'; Codehighlighter1_232_256_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> agerSingleton getInstance()</span><span id="Codehighlighter1_232_256_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"></span><span id="Codehighlighter1_232_256_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> m_instance;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_293_393_Open_Image" onclick="this.style.display='none'; Codehighlighter1_293_393_Open_Text.style.display='none'; Codehighlighter1_293_393_Closed_Image.style.display='inline'; Codehighlighter1_293_393_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_293_393_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_293_393_Closed_Text.style.display='none'; Codehighlighter1_293_393_Open_Image.style.display='inline'; Codehighlighter1_293_393_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> viod printName(String name)</span><span id="Codehighlighter1_293_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"></span><span id="Codehighlighter1_293_393_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">newClass.operationByNameAndReturnValue(String name);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(value);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>乍一看，代码中除了构造函数对私有属性进行了初始化操作，其他地方没有对私有属性的赋值，不会引起非法逻辑陷阱。其实这个赋值操作可能隐含在newClass.operationByNameAndReturnValue(String name)操作，只有保证了NewClass的operationByNameAndReturnValue操作不会对它的私有属性赋值操作，才能保证真正的合理逻辑。同样，只有保证NewClass的operationByNameAndReturnValue操作没有掉入访问互斥资源陷阱，才能真正保证EagerSingleton没有掉入该陷阱。<br />        消除该陷阱的方法：（1）类方法的名称要合理，比如纯粹的行为方法名：interprete,excute,operation之类的方法中就不该含有对私有属性直接或者间接的赋值操作，每个方法的责任要明确。（2）单例类中尽量不要含有非单例类的实例作为私有属性（容器类除外），一定要有类的实例作为私有属性的时候，重新审视这个作为私有属性的类，是不是也应该设计成单例类；或者保证对它的初始化赋值限制在构造函数内。</div>
		</div>
<img src ="http://www.blogjava.net/onlykeke/aggbug/69537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-09-14 09:36 <a href="http://www.blogjava.net/onlykeke/archive/2006/09/14/69537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java &amp; Pxx</title><link>http://www.blogjava.net/onlykeke/archive/2006/09/13/69339.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Wed, 13 Sep 2006 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/09/13/69339.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/69339.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/09/13/69339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/69339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/69339.html</trackback:ping><description><![CDATA[大师James关于Java和流行脚本语言相互比较的说话。只是其中没有明确提到Perl，很是让我郁闷。<br /><br /><strong>Yakov Fain</strong>:在世界上有许多不同的语言。有些人在说一些新语言的出现会对Java构成威胁，你认为呢？ <br /><strong>James Gosling</strong>:不，我不这么认为。最近出现的大部分语言都是脚本型语言，例如：象PHP和Ruby，这些都是完美的系统。它们的强大是因为经过了特殊的处理化，因此所有这些人们谈论的令他们今天很兴奋的语言都仅仅是用来产生Web页面的。因此你们只是想生成一个网页，他们会做得很好。但是在应用领域别指望它们能有更大的做为，因为他们都有严重的性能问题。在所有这些动态语言中，如果你试着用它们编写一些对执行有严格要求的东西，那么它们都会可怕地失败。如果你写一个语句a = b + c，在性能差异上，Java与PHP相比可能完全一样。它们真正优良的地方在于它们都专注于一个领域，他们会使在那个领域的编程更加简单。我们一直在做的就是在工具之外获得更多的简化，我们做了大量的工作来达到简单性和功能强大性之间的一个平衡点。他们彼此之间是相互依存，相互排斥的。构建具有强大功能的系统，恰恰要有几分复杂性。正是因为这样，世界才相互联系，极大地帮助你运行的系统有了可以延续的框架。利用PHP，你能将Web表现层的内容做得很好。你不要用PHP去写一个星际导航的类库。这个它做不到。 <br /><br />    另一个与之有关的就是Microsoft的C#。很难在一个水平上批评C#，因为他们就是拷贝了Java规范。那是我们担心他们会做出一些创新的东西的时刻，但他们没有，他们没有选择借鉴。很明显，他们只是集中于一个开发平台。 <br />我们尝试和所有的这些语言一起工作。我们知道有许多人在谈论Java与X相比或Java与Y相比如何如何。我们在努力工作来保证Java与PHP或Java与Python相结合在一起。这样你能用PHP做Web的表现层。许多的人用PHP做Web的表现层，用Java来做分析部分的工作，因为Java在做高质量的分析工作方面真的是太棒了。 <br /><br />    基于以上的分析， Ruby、PHP、Python等脚本语言想要超越Java和.Net，困难挺大的。就我个人而言，我喜欢编程语言的多样性，欢迎Ruby、PHP、Python等脚本语言的流行。因为它们会促进新思想和新语言的诞生。那么，十年之后能替换Java、.Net的语言会出现吗？如果出现这样的语言，会是Ruby、PHP、Python等脚本语言吗？或者是一门新的X语言呢？我的回答是一切皆有可能。<br /><div id="ParagraphCount" style="DISPLAY: none">1</div><img src ="http://www.blogjava.net/onlykeke/aggbug/69339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-09-13 11:42 <a href="http://www.blogjava.net/onlykeke/archive/2006/09/13/69339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How proxool works</title><link>http://www.blogjava.net/onlykeke/archive/2006/08/24/65519.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Thu, 24 Aug 2006 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/08/24/65519.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/65519.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/08/24/65519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/65519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/65519.html</trackback:ping><description><![CDATA[
		<p>[http://proxool.sourceforge.net/howitworks.html]<br />Proxool acts as a proxy. That is, when you ask it to do something it delegates that task to another JDBC driver (you can use whatever driver you like). This has an important benefit: you can switch from any JDBC driver to Proxool by simply making a few configuration changes. The standard life cycle of asking the DriverManager for a Connection and then closing that Connection when you have finished with it remains unchanged.</p>
		<div class="codeSample">Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");<br />connection = DriverManager.getConnection(url);<br />...<br />connection.close();<br /></div>
		<p>When the ProxoolDriver gives you a Connection it actually gives you a ProxyConnection instead. The ProxyConnection does everything that a Connection does except that when you call the close() method it doesn't really close. Instead, it puts itself back into the pool.</p>
<img src ="http://www.blogjava.net/onlykeke/aggbug/65519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-08-24 15:06 <a href="http://www.blogjava.net/onlykeke/archive/2006/08/24/65519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Language Evaluations[by Eric Raymond]</title><link>http://www.blogjava.net/onlykeke/archive/2006/08/20/64667.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Sun, 20 Aug 2006 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/08/20/64667.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/64667.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/08/20/64667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/64667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/64667.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Language Evaluations																						Mixing languages is a knowledge-intensive (rather than coding-intensive) style of programming. To make it work, you have to have both working knowledg...&nbsp;&nbsp;<a href='http://www.blogjava.net/onlykeke/archive/2006/08/20/64667.html'>阅读全文</a><img src ="http://www.blogjava.net/onlykeke/aggbug/64667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-08-20 22:10 <a href="http://www.blogjava.net/onlykeke/archive/2006/08/20/64667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Captcha</title><link>http://www.blogjava.net/onlykeke/archive/2006/07/31/61069.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Mon, 31 Jul 2006 11:13:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/07/31/61069.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/61069.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/07/31/61069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/61069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/61069.html</trackback:ping><description><![CDATA[    司空见惯的图片认证注册码 终于和 这么一个单词对上号了：<span class="hilite">captcha（读音：Capture Ya,逮着你了）。<br />    </span><b>C</b>ompletely <b>A</b>utomated <b>P</b>ublic Turing <b>T</b>est to Tell <b>C</b>omputers and <b>H</b>umans <b>A</b>part (全自动<a class="bluekey" href="http://www.yesky.com/key/4406/139406.html" target="_blank"><font face="Arial" color="#000000">区分</font></a>计算机和人类的图灵测试)<br /><span class="hilite">    相关文章中提到这个项目：http://sam.zoy.org/pwntcha/，个人感觉目前的识别算法只能识别比较简单的认证图形，要达到完整识别，难度可比人类登陆火星。<br />推荐文章<br />[http://kb.csdn.net/java/Articles/200606/ab079af9-0fe6-4b00-8efb-ace38c802542.html]<br />[http://william.cswiz.org/blog/archives/2005-03-18/captcha/]<br />[</span><a href="http://jcaptcha.sourceforge.net/">http://jcaptcha.sourceforge.net/</a><span class="hilite">]<br />[</span><a href="http://www.captcha.net/">http://www.captcha.net/</a><span class="hilite">]<br /></span><img src ="http://www.blogjava.net/onlykeke/aggbug/61069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-07-31 19:13 <a href="http://www.blogjava.net/onlykeke/archive/2006/07/31/61069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中文网址？垃圾！！！</title><link>http://www.blogjava.net/onlykeke/archive/2006/07/31/61045.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Mon, 31 Jul 2006 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/07/31/61045.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/61045.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/07/31/61045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/61045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/61045.html</trackback:ping><description><![CDATA[    新本本上的电驴跑上几分钟后立刻狂占CPU，非常郁闷。网友解释，中文网址软件导致此类现象。颇为疑惑啊，我的机器上不可能装有此类垃圾软件吧，打开卸载程序列表，中文网址赫然在列，恶狠狠删除之，从此电驴一路畅跑，怎一个爽字了得！<br />    结论：中文网址＝垃圾！！<br /><img src ="http://www.blogjava.net/onlykeke/aggbug/61045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-07-31 16:44 <a href="http://www.blogjava.net/onlykeke/archive/2006/07/31/61045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Pet Store开始全面使用Web2.0 技术[转]</title><link>http://www.blogjava.net/onlykeke/archive/2006/05/18/46899.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Thu, 18 May 2006 13:12:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/05/18/46899.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/46899.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/05/18/46899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/46899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/46899.html</trackback:ping><description><![CDATA[
		<p>
				<a id="java_pet_store_%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8_web" name="java_pet_store_%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8_web">
				</a>
				<b>Java Pet Store 开始全面使用Web 2.0 技术</b>
				<br />
		</p>
		<div id="blogphoto">
				<p>
						<img height="1" src="http://blogs.sun.com/roller/resources/theaquarium/petstore.jpg" width="1" align="left" />
						<br />伴随着<strong>Java EE 5 SDK(</strong><a href="http://java.sun.com/javaee/downloads/index.jsp">下载</a><strong>) 的</strong>发布,最新的 <a href="https://blueprints.dev.java.net/petstore/index.html">Pet Store</a> (最初版) 开始全面启用 Web 2.0 技术。 </p>
				<p>
						<a href="http://weblogs.java.net/blog/sean_brydon/archive/2006/05/need_a_referenc.html">Sean</a> 和 <a href="http://blogs.sun.com/geertjan?entry=released_java_pet_store_reference">Geertjan</a> 都曾经对此有所介绍。 <a href="http://blogs.sun.com/roller/page/alexismp?entry=java_pet_store_short_video">Alexis</a> 还制作了一个短片向您展示怎样在 NetBeans 中启动<br /> <br />Pet Store（ <a href="http://blogs.sun.com/roller/resources/alexismp/petstore.html">大型</a> 或 <a href="http://blogs.sun.com/roller/resources/alexismp/petstore-small.html">小型</a>）。 </p>
		</div>
		<br clear="all" />
		<div class="ta-tags">
				<a href="http://technorati.com/tag/AJAX" target="_blank" rel="tag">AJAX</a>, <a href="http://technorati.com/tag/PetStore" target="_blank" rel="tag">PetStore</a> ,<a href="http://technorati.com/tag/JavaEE" target="_blank" rel="tag">JavaEE</a></div>
<img src ="http://www.blogjava.net/onlykeke/aggbug/46899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-05-18 21:12 <a href="http://www.blogjava.net/onlykeke/archive/2006/05/18/46899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA EE 5.0[转]</title><link>http://www.blogjava.net/onlykeke/archive/2006/05/18/46741.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Thu, 18 May 2006 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/05/18/46741.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/46741.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/05/18/46741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/46741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/46741.html</trackback:ping><description><![CDATA[sun公司终于发布了javaEE 5.0,下面是它的特点：<br /><br />第一个商业的,比较完善的Java EE 5 实现<br />简化开发--对编程模式的重新组织<br />支持EJB3.0--POJO<br />支持Java Persistence API , ORM更简单<br />JAX-WS 2.0 以及 JAXB 2.0 使得开发web services 以及SOA应用更加便捷<br />JavaServer Faces 1.2--更简易开发AJAX<br />效率更高, 同时管理和部署功能更强大<br />启动速度提高30%, 占用内存减少30%.<br />web services 效率提高至少5倍.<br />web services 管理更强大<br />整合了NetBeans以及支持Eclipse plug-in<br />提供了整合NetBeans的可视化的SOA 开发以及部署<br />Sun's Java System Application Server PE 9.0是完全开源的<br /><br />更详细的介绍看这里：<br /><a class="" title="" href="http://java.sun.com/developer/technicalArticles/J2EE/intro_ee5/" target="_blank"><font color="#000099">Update: An Introduction to the Java EE 5 Platform</font></a><br /><br />下载地址：<br /><a class="" title="" href="http://java.sun.com/javaee/downloads/index.jsp" target="_blank"><font color="#000099">Java EE 5.0</font></a><img src ="http://www.blogjava.net/onlykeke/aggbug/46741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-05-18 09:35 <a href="http://www.blogjava.net/onlykeke/archive/2006/05/18/46741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>