关于java的双重检查法应用说明

最近项目中用到了双重检查法(是从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){

Synchronizedthis{

Iffoo=null{

foo=new Foo();

}

}

 

}

Return foo;

}

}

可以看到,在上面的方法中,同步化仅用来避免多个线程同时初始化这个类,而不是同时调用这个静态工厂方法。着就是双重检查法的妙用之处。两次判断之后在创建。

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值