单例模式

     单例设计模式在java中出现不是很频繁,一个类只有一个实例对象,这  
 其实可以用静态变量或者将一个类的方法和变量设置为static实现。  
 但单例设计模式可以弥补他们的缺点,就是可以延迟初始化时间,避免  
 对象占用资源较大时造成资源的占用。  
      如果将类的方法和变量设置为static,但这样做有时取决于JVM,  
 有些JVM  在用到变量时才初始化对象,这就导致初始化控制权在JVM上,而不是  
  程序上,有时会导致一些bug(具体什么bug也不太清楚,headfirst这  
  句话有点捉摸不透)。
        看一下例子吧
         最简单的不过开始时就初始化  
         ···

public class Singleton {
public static Singleton instance=new Singleton();
public Singleton newInStance(){
return instance;
}
private Singleton(){

}

···
但这样如果对象占用资源很大时就会造成浪费。所以有下面这种延迟初始化
···
public synchronized Singleton newInStance(){
if(instance==null){
instance=new Singleton();
}

    return instance;
}

···
但这种在多线程又会有问题,有时会有多个Singleton对象,所以应该同步
···
public synchronized Singleton newInStance(){
if(instance==null){
instance=new Singleton();
}

    return instance;
}

···
这种最安全,可是会造成多个线程等待问题,效率甚至能下降100倍
,所以程序使用频繁时最好不要使用 , 为解决这个问题可以在代码局部使用
···
public Singleton newInStance(){
synchronized (Singleton.class){
if(instance==null){
instance=new Singleton();
}
}

    return instance;
}

···
还有更好的方法
···
public Singleton newInStance(){
if(instancenull){
synchronized (Singleton.class){
if(instance
null){
instance=new Singleton();
}
}
}
return instance;
}
···
确保只有第一次实例才同步,避免同步带来的消耗。
这两种并不是完美的,原因是JIT编译器有时会对代码优化,进行重排序
关于这部分参考以下博客
所以可以用public static volatile Singleton instance=null;这句声明解决

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值