@NotThreadSafe
public class LazyInitRace{
private ExpensiveObject instance = null;
public ExpensiveObject getInstance(){
if(instance == null){
return new ExpensiveObject();
}
}
}使用@GuardedBy("this")加到属性上和synchronized加到方法上能够满足保证instance不会出现两个吧?

解决方案 »

  1.   

    public class Singleton {  
      
      static class SingletonHolder {  
        static Singleton instance = new Singleton();  
      }  
      
      public static Singleton getInstance() {  
        return SingletonHolder.instance;  
      }  
      
    }  
      

  2.   

    只用过synchronized,它的缺点,是当instance非空时,这个锁操作有点多余了。
    另外,你的getinstance方法还是有点小问题的。
      

  3.   

    public class Singel
    {
    private Singel s=null;
    private Singel(){}
    public Singel getInstance(){
    if(s==null){
    synchronized(Singel.class){
       if(s==null)
       s=new Singel();
    }
    }
    return s;
    }
    }
    单例设计模式中的懒汉式,由于同步函数的方式每一次都会要判断锁,造成效率低。所以,可采用双重判断的形式,只需要判断一次即可。
      

  4.   

    单例模式除了懒汉式 还有一个饿汉式的
    class Singleton {
      private static Singleton instance=new Singleton();
      private Singleton(){}
      static Singleton getInstance() {
          return instance;
      }
    }
    而懒汉式在没有多线程的情况下可以这样写
    class Singleton {
      private static Singleton instance=null;
      private Singleton(){}
      static Singleton getInstance() {
          if(instance==null)
          instance=new Singleton();
          return instance;
      }
    }
      

  5.   

    4楼和楼主写的都不是单例。4楼这个根本没法用,因为方法上没加static。
    楼主那个倒是可以用,因为人家可以随便new。
      

  6.   

    楼主java concurrency in practice看多了吧。。那两个注解实际是木有的,可以是自定义的,只是来标注一个类或方法是不是线程安全的,起到注释的作用既然说到单例或延迟初始化,不得不看这篇文章:http://ifeve.com/doublecheckedlocking/