单例模式

java模式之单例模式
          单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
       1,一个类只能有一个实例
       2,自己创建这个实例
       3,整个系统都要使用这个实例

 

两种形式:
饿汉式单例类
public class Singleton {

  private Singleton(){}

  //在自己内部定义自己一个实例,是不是很奇怪?
  //注意这是private 只供内部调用

  private static Singleton instance = new Singleton();

  //这里提供了一个供外部访问本class的静态方法,可以直接访问 
  public static Singleton getInstance() {
    return instance;  
   }
}

懒汉式单例类

public class Singleton {

  private static Singleton instance = null;

  public static Singleton getInstance() {

  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次   


  //使用时生成实例,提高了效率!
  if (instance==null)
    instance=new Singleton();
  return instance;   }

}

 

上面这个在单线程中是可以的,但是在对线程中有可能出错,于是改成如下

 

代码清单1

 

public class Singleton {

  private static Singleton instance = null;

  public static synchronized Singleton getInstance() {

  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次   


  //使用时生成实例,提高了效率!
  if (instance==null)
    instance=new Singleton();
  return instance;   }

}

有人提出了 “双重检查锁定”

双重检查锁定背后的理论是完美的。不幸地是,现实完全不同。双重检查锁定的问题是:并不能保证它会在单处理器或多处理器计算机上顺利运行。

双重检查锁定失败的问题并不归咎于 JVM 中的实现 bug,而是归咎于 Java 平台内存模型。内存模型允许所谓的“无序写入”,这也是这些习语失败的一个主要原因。

 

故解决单例模式最好的方法是

 

  • 接受getInstance() 方法的同步(代码清单1)。

  • 放弃同步,而使用一个 static 字段(饿汉式单例类)。
  •  

    你可能感兴趣的:(jvm,多线程)