Java复习11. 单例编程

Java复习11. 单例编程
1. 最简单的写法,那个方式是线程不安全的
public  class  Singleton {
     private  static  Singleton  instance ;
     private  Singleton(){}
     public  static  Singleton getInstance(){
          if ( instance  ==  null ){
              instance  =  new  Singleton();
        }
          return  instance  ;
    }
}
2. 因为上面的是线程不安全的,所以我们确保线程安全的方式使用  synchronized 修饰  getInstance 方法,这样的话确保了线程的安全,但是有问题,效率很低,大多数情况下此方法不需要同步,杀鸡用牛刀,有点过了
public  class  Singleton {
     private  static  Singleton  instance ;
     private  Singleton(){}
     public  static synchronized  Singleton getInstance(){
          if ( instance  ==  null ){
              instance  =  new  Singleton();
        }
          return  instance  ;
    }
}
3. 确保线程安全我们使用另一种方式,这一种方式在声明单例的时候,就已经将一个对象初始化好,但是不知道什么时候用,在程序启动的时候就初始化好了,增加的系统的负担和启动时间,效率不高。没有达到  lazyloading 的效果。而且只允许一种方式调用实例。这种方式也是线程安全的,因为他是基于  classLoad 机制的。
public  class  Singleton {
     private  static  Singleton  instance  =  new  Singleton();
     private  Singleton(){}
     public  static  Singleton getInstance(){
          return  instance  ;
    }
}
4. 静态内部类的实现方式
这一种方式同样是利用了  classloader 的机制来保证初始化  instance 时只有一个线程,但是区别上一种方式的是,这里起到了  lazyloading 的效果,这里  singleton 被状态的时候,,  instance 没有被初始化。因为  singletonholer 没有被主动地调用,,只有通过显示调用的方式,才会装在  SingletonHolder class   进而才会初始化 instance
public  class  Singleton {
     private  static  class  SingletonHolder{
          private  static  final  Singleton  INSTANCE  =  new  Singleton();
    }
     private  Singleton(){}
     public  static  final  Singleton getInstance(){
          return  SingletonHolder. INSTANCE ;
    }
}
5. 双重校验锁
public  class  Singleton {
     private  volatile  static  Singleton  singleton ;
     private  Singleton(){}
     public  static  Singleton getInstance(){
          if ( singleton    ==  null ){
              synchronized (Singleton. class ){
                  if ( singleton  ==  null ){
                      singleton  =  new  Singleton();
                }
            }
        }
          return  singleton  ;
    }
}
这种叫做双重校验锁机制,需要在  jdk1.5 之后才可以。
最好的是使用双重校验锁的机制实现单例程序
 
YangTengfei
2013.11.23

你可能感兴趣的:(java)