java设计模式-单例模式

Java中单例模式是一种常见的设计模式
  单例模式有以下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。
  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

/**
* 单例模式最优方案
* 线程安全 并且效率高
*
*/
public class SingletonTest {

// 定义一个私有构造方法
private SingletonTest() {

}
//定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)
private static volatile SingletonTest instance;

//定义一个共有的静态方法,返回该类型实例

//双重检查锁定
public static SingletonTest getIstance() {
// 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)
  if (instance == null) {
//同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
  synchronized (SingletonTest.class) {
//未初始化,则初始instance变量
    if (instance == null) {
      instance = new SingletonTest();
    }
  }
}
  return instance;
  }
}

eg:

class TestSingleton {
  String name = null;

  private TestSingleton() {
  }

  private static volatile TestSingleton instance = null;

  public static TestSingleton getInstance() {
    if (instance == null) {
      synchronized (TestSingleton.class) {
        if (instance == null) {
          instance = new TestSingleton();
        }
      }
    }
  return instance;
}

  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }

  // public void printInfo() {
  // System.out.println("the name is " + name);
  // }

  }

class Tmain {
  public static void main(String[] args){
    TestSingleton ts1 = TestSingleton.getInstance();
    //ts1.setName("1234");
    TestSingleton ts2 = TestSingleton.getInstance();
    //ts2.setName("0539");

    // ts1.printInfo();
    // ts2.printInfo();

    if(ts1 == ts2){
    System.out.println("创建的是同一个实例");
    }else{
      System.out.println("创建的不是同一个实例");
    }
  }
}

result:

从结果来看,变量ts1和ts2值相等,说明两次调用getInstance()方法获得的是同一个对象,而getInstance()是获得Single类实例的唯一途径,因此是一个单例的类。

 

posted @ 2017-05-05 15:33  狼太白  阅读(100)  评论(0编辑  收藏  举报