最近项目中用到了双重检查法(是从C语言移植过来 的一种代码模式):个人觉得这是一种非常好的设计方法,就是在检查一个对象为空的情况下取创建一个新的对象出来,如果不为空就直接使用,下面通过一个详细的案例讲述一下:
Class test(){
Private Foo foo=null;
Public Foo getFoo(){
If(foo==null){
foo=new Foo();
}
Return foo;
}
}
这样要保证在整个JVM中国只有一个foo的实例,但是在多线程的条件下可能会同时有多个对象被创建出来,从而造成错误,下面给出一个线程安全的例子:
Class test(){
Private Foo foo=null;
Public synchronized Foo getFoo(){
If(foo==null){
foo=new Foo();
}
Return foo;
}
}
这样的话由于整个静态工厂都是同步的,因此不会有两个线程同时进入,但是存在一个问题,如果在foo变量不为空的情况下,就会有瓶颈,其实同步化实际上只在helper变量第一次被赋值之前才有用。在foo变量有了值以后,同步化实际上变成了一个不必要的瓶颈。这样会增加不必要的时间浪费。
Classtest(){
Private Foo foo=null;
Public Foo getFoo(){
If(foo==null){
Synchronized(this){
If(foo=null){
foo=new Foo();
}
}
}
Return foo;
}
}
可以看到,在上面的方法中,同步化仅用来避免多个线程同时初始化这个类,而不是同时调用这个静态工厂方法。着就是双重检查法的妙用之处。两次判断之后在创建。