zoukankan      html  css  js  c++  java
  • 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类实例的唯一途径,因此是一个单例的类。

  • 相关阅读:
    Java抽象类和接口和继承之间关系
    Java程序中解决数据库超时与死锁
    怎样成为一名出色的Java Web程序员?
    Java中断线程的方法
    Java 集合框架(Collection)和数组的排序
    StringBuffer帮你减轻Java的负担
    学好Java开发的关键七步
    kvm的分层控制
    一个高扩展高可用高负载的应用架构的诞生记(原创)
    防火墙规则
  • 原文地址:https://www.cnblogs.com/shamoguzhou/p/6813256.html
Copyright © 2011-2022 走看看