单例模式

来源:互联网 发布:js如何获取单选框的值 编辑:程序博客网 时间:2024/06/14 11:16

参考菜鸟博客,网址:http://www.runoob.com/design-pattern/singleton-pattern.html


单例模式:当您想控制实例数目,节省系统资源的时候。

应用实例:windows是多进程多线程,在操作文件时可能有多个进程或者线程同时操作一个文件,所以,所有的文件必须通过唯一的实例来进行。


我们将创建一个 SingleObject 类。SingleObject 类有它的私有构造函数和本身的一个静态实例。

SingleObject 类提供了一个静态方法,供外界获取它的静态实例。SingletonPatternDemo,我们的演示类使用SingleObject 类来获取SingleObject 对象。


实例1

public class SingleObject {   //创建 SingleObject 的一个对象   private static SingleObject instance = new SingleObject();   //让构造函数为 private,这样该类就不会被实例化   private SingleObject(){}   //此方法阻止了,该类被实例化,即不可 SingleObject object = new SingleObject();   //获取唯一可用的对象   public static SingleObject getInstance(){      return instance;   }   public void showMessage(){      System.out.println("Hello World!");   }}

获取:

public class SingletonPatternDemo {   public static void main(String[] args) {      //不合法的构造函数      //编译时错误:构造函数 SingleObject() 是不可见的      //SingleObject object = new SingleObject();      //获取唯一可用的对象      SingleObject object = SingleObject.getInstance();      //显示消息      object.showMessage();   }}


几种实现方式:

1懒汉式

线程不安全

public class Singleton {      private static Singleton instance;  //实例化,在需要时才实例化,故懒    private Singleton (){}        public static Singleton getInstance() {      if (instance == null) {          instance = new Singleton();      }      return instance;      }  }  

线程安全-加锁,保证了单例,但加锁影响效率

public class Singleton {      private static Singleton instance;      private Singleton (){}      public static synchronized Singleton getInstance() {  //添加锁    if (instance == null) {          instance = new Singleton();      }      return instance;      }  } 


二。饿汉式

线程安全-无锁,执行效率高

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

三、双检锁/双重校验锁(DCL,即 double-checked locking)

线程安全,且运行效率高

public class Singleton {      private volatile static Singleton singleton;      private Singleton (){}      public static Singleton getSingleton() {      if (singleton == null) {          synchronized (Singleton.class) {          if (singleton == null) {              singleton = new Singleton();          }          }      }      return singleton;      }  }  

。。。。。很多,,,,,

0 0
原创粉丝点击