??xml version="1.0" encoding="utf-8" standalone="yes"?> 同步I/O操作Dhq程dQ直x作完?br />异步I/O操作不导致请求阻塞?br /> 今天去jdonQ看了它的设计研I栏目,bang有几评论单例模式的文章Q声U“Singleton is evil”(?a >http://www.jdon.com/jive/article.jsp?forum=91&thread=17578Q,q且引用几篇外文面佐证自己的观点,其中有一文章更是说Q单例不仅不是一U模式,而是一U反模式?br /> 下面我谈谈我对单例模式的看法。逐一分析单例模式的陷阱,帮助大家正确使用单例模式?br />Q?Q 陷׃Q调用函数的性能瓉 LazySingleton对象的初始化推q到调用的时候。ƈ且ؓ了防止多U程环境下生多个实例,使用synchronized关键字保证函数getInstance调用的线E安全。synchronized关键字的存在保证了只会生一个对象,但也成了多线E环境下的性能瓉。一个多U程的程序,Cq里却要排队{候成了一个单U程式的执行程Q这在高q发环境下是不可容忍的。而c++中可以用双重检查机制将q种性能问题仅仅限制在第一ơ构造对象的时候,而java中不可以使用双重查机制?br /> 但是java可以实现EagerSingletonQ实现如下: 该类含有一U有属性valueQ在多线E环境下不能保证value值的合理逻辑Q一U程getValueByName?马上printValueQ也有可能value的值已l被其他U程修改。这U情况就属于单例模式的滥用,该类Ҏ不适合做成单例?br /> 消除非法逻辑的陷阱,可以通过该c重构ؓUa的行为类完成。重构后的代码如下: 通过调用printName(String name)直接完成操作程Q将其中的私有属性处理成q程式的参数传递,该cMҎUa的行为类?/p> 含有U有属性ƈ且含有对它赋值操作的cdƈ非都会调入该陷阱Q构造函数里q行对私有属性赋g会引起非法逻辑Q如下代?/p> 构造函数里不必要加U程安全关键字也可以保证U程安全Q因为类加蝲器是U程安全的,EagerSingleton只会在类加蝲的时候实例化一ơ,q样不会出现单例模式的线E不安全Q也不会造成非法逻辑?br />Q?Q陷阱四Q单例陷q传?br /> 当含有对象作为单例类的私有属性时Q陷׃仅会出现在该cLw,q会传递到U有对象所在的cM。看如下代码Q?/p>
2、非dI/O
3、I/O复用Qselect、poll、linux 2.6U改q的epollQ?br />4、信号驱动IOQSIGIOQ?br />5、异步I/OQPOSIX的aio_pd函数Q?br />同步I/O和异步IO
POSIX把这两个术语定义如下Q?br />
Ҏ上述定义Q前四种I/O模型都是同步I/OQ第5U才是异步I/O?br />
select不允许多于一个的U程在同一个描q符集上{待。这使得反应式模型不适用于高性能应用Q因为它没有有效地利用硬件的q行性?br />异步I/O通常能够提高更好的性能Qwindows的iocp通过内核U程调度Q也能提供很好的q发性能Q但不是真正的异步?br />Java nio和多路复?/h2>
java
1.4 nio提供的selectQ这是一U多路复用I/OQmultiplexed non-blocking
I/OQ模型,底层是用select或者poll。I/O复用是Q阻塞在select或者pollpȝ调用的某一个之上,而不是阻塞在真正的I/Op?
l调用之上。JDK 5.0 update 9和JDK 6.0在linux下支持用epollQ可以提高ƈ发idle connection的性能Q?a >http://blogs.sun.com/alanb/entry/epollQ?br />
以前看到有h猜测Windows下nio使用了IOCPQ那应该是错的,毕竟IOCP不是多\复用I/O模型。从JavaOne 2006的灯片来看Qaio才会使用IOCP来实现的?br />Java aio和JSR 203
2003q_有了JSR 203Q?u>http://jcp.org/en/jsr/detail?id=203Q,但是一直没有实现?br />
l于QJSR 203的spec lead_会在Java SE 7.0中完成JSR 203QJava SE 6.0已经是RCQ很快正式版׃发布Q然后就是Java SE 7.0Q估计我们不需要等太久了?a >
http://blogs.sun.com/alanb/entry/what_is_happening_with_jsr
asynchronous
I/O对于Java的媄响,不会低于当qJDK 1.4 nio引入multiplexed non-blocking
I/O的媄响,很多的Java应用都会重写。如同Linux
2.6支持AIOQDB2、Oracle数据库都会发布新版本Q说支持使用AIOQ性能提高多少多少云云Q主要是AIO的文件操作部分)?br />
对asynchronous I/O的支持,JavaE序p够支撑大q发|络应用了,在IO模型斚wQ对于C/C++{语a不再存在“C/C++能做Q但是Java不能做的事情”?br />
q个是Java One 2006上的qȝ片?br />http://blogs.sun.com/roller/resources/alanb/bof0895.pdf
提到了:
需要新的channel types支持异步I/O模型
使用Native机制Q例如Windows IO Completion ports?br />
[附]
JDK 6.0 nio支持epollQ对q发idle connection会有大幅度的性能提升Q这是很多|络服务器应用程序需要的?br />
One of the updates in build 59 of
Mustang
(JavaTM SE 6)
is that the New I/O
Selector
implementation will use the
epoll event notification
facility when running on the Linux 2.6 kernel.
JDK 5.0 update 9也支持:
The epoll SelectorProvider will be included in 5.0 update 9. To enable
it requires setting the system property
java.nio.channels.spi.SelectorProvider to the value
sun.nio.ch.EPollSelectorProvider.
5UIO模型Q?br />dIO
非阻塞IO
多\复用
信号驱动IO
异步IO
最好性能的还是异步IOQ目前Java只能支持到多路复用一U,期待着以后Java 7.0/8.0支持异步IOQ?.0是没有希望了?br />
]]>
Does Wicket Suit Your Web Framework Style?
Comparing Web Frameworks: Wicket
http://javageek.org/2006/03/08/comparing_web_frameworks_wicket.html
]]>
单例模式陷阱
Posted on 2006-08-26 11:26 JavaExplore
在c++中,单例只有一U实现方式——LazySingleton, 实现如下(本文全部使用java代码)Q?/p>
public
class
LazySingleton
{
private
static
LazySingleton m_instance
=
null
;
private LazySingleton(){};
synchronized public static LazySingleton getInstance(){
if(m_instance!=null)
m_instance=new LazySingleton();
return m_instance;
}
}
public
class
EagerSingleton
{
private
static
EagerSingleton m_instance
=
new
EagerSingleton();
private EagerSingleton(){};
public static agerSingleton getInstance(){
return m_instance;
}
}
public class EagerSingleton{
private static EagerSingleton m_instance=new EagerSingleton();
private HashMap map=new HashMap();
private EagerSingleton(){};
public static agerSingleton getInstance(){
return m_instance;
}
public void refreshMap(Object key){
synchronized(map){
if(!map.contains(key))
map.put(key,value);//value为此时的实时数据
}
}
}
q种情况一般是滥用单例模式造成的,下面考虑一U滥用单例的情况。下面的代码的作用是getValueByName?马上printValue卛_成操作流E?br />public class EagerSingleton{
private static EagerSingleton m_instance=new EagerSingleton();
private String value=null;
private EagerSingleton(){};
public static agerSingleton getInstance(){
return m_instance;
}
synchronized public void getValueByName(String name){
value=getByNameFromDateBase(name);
}
public viod printValue(){
System.out.println(this.vaue);
}
}
public class EagerSingleton{
private static EagerSingleton m_instance=new EagerSingleton();
private EagerSingleton(){};
public static agerSingleton getInstance(){
return m_instance;
}
private String getValueByName(String name){
return getByNameFromDateBase(name);
}
public viod printName(String name){
String value=getValueByName(String name);
System.out.println(value);
}
}
public class EagerSingleton{
private static EagerSingleton m_instance=new EagerSingleton();
private HashMap map==new HashMap();
private EagerSingleton(){
map.put(key,value);//value为此时的实时数据
}
public static agerSingleton getInstance(){
return m_instance;
}
}
public class EagerSingleton{
private static EagerSingleton m_instance=new EagerSingleton();
private NewClass newClass=nll;
private EagerSingleton(){
newClass=new NewClass();
};
public static agerSingleton getInstance(){
return m_instance;
}
public viod printName(String name){
String value=newClass.operationByNameAndReturnValue(String name);
System.out.println(value);
}
}
]]>
Yakov Fain:在世界上有许多不同的语言。有些h在说一些新语言的出C对Java构成威胁Q你认ؓ呢?
James Gosling:不,我不q么认ؓ。最q出现的大部分语a都是脚本型语aQ例如:象PHP和RubyQ这些都是完的pȝ。它们的强大是因为经q了Ҏ的处理化Q因此所有这些h们谈论的令他们今天很兴奋的语a都仅仅是用来产生Web面的。因此你们只是想生成一个网,他们会做得很好。但是在应用领域别指望它们能有更大的做ؓQ因Z们都有严重的性能问题。在所有这些动态语a中,如果你试着用它们编写一些对执行有严D求的东西Q那么它们都会可怕地p|。如果你写一个语句a = b + cQ在性能差异上,Java与PHP相比可能完全一栗它们真正优良的地方在于它们都专注于一个领域,他们会在那个领域的~程更加单。我们一直在做的是在工具之外获得更多的化,我们做了大量的工作来辑ֈ单性和功能强大性之间的一个^衡点。他们彼此之间是怺依存Q相互排斥的。构建具有强大功能的pȝQ恰恰要有几分复杂性。正是因P世界才相互联p,极大地帮助你q行的系l有了可以gl的框架。利用PHPQ你能将Web表现层的内容做得很好。你不要用PHPd一个星际导航的cd。这个它做不到?
另一个与之有关的是Microsoft的C#。很隑֜一个水q上批评C#Q因Z们就是拷贝了Java规范。那是我们担心他们会做出一些创新的东西的时刻,但他们没有,他们没有选择借鉴。很明显Q他们只是集中于一个开发^台?
我们试和所有的q些语言一起工作。我们知道有许多人在谈论Java与X相比或Java与Y相比如何如何。我们在努力工作来保证Java与PHP或Java与Python相结合在一赗这样你能用PHP做Web的表现层。许多的人用PHP做Web的表现层Q用Java来做分析部分的工作,因ؓJava在做高质量的分析工作斚w真的是太了?
Z以上的分析, Ruby、PHP、Python{脚本语a惌越Java?NetQ困难挺大的。就我个言Q我喜欢~程语言的多h,Ƣ迎Ruby、PHP、Python{脚本语a的流行。因为它们会促进新思想和新语言的诞生。那么,十年之后能替换Java?Net的语a会出现吗Q如果出现这L语言Q会是Ruby、PHP、Python{脚本语a吗?或者是一门新的X语言呢?我的回答是一切皆有可能?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.
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.
伴随着Java EE 5 SDK(下蝲) ?/strong>发布,最新的 Pet Store (最初版) 开始全面启?Web 2.0 技术?
Sean ?Geertjan 都曾l对此有所介绍?Alexis q制作了一个短片向您展C怎样?NetBeans 中启?br />
Pet StoreQ?大型 ?型Q?