ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java设计模式之001--单例模式

2020-09-21 22:01:41  阅读:150  来源: 互联网

标签:Singleton Java -- private 实例 static 单例 设计模式 public


单例模式(Singleton : 是一种常用的软件设计模式。 在它的核心结构中只包含一个被称为单例的特殊类。

    通过单例模式可以保证系统中, 应用该模式的类一个类只有一个实例, 即一个类只有一个对象实例。

    目的是为了节省重复创建对象所带来的内存消耗, 从而来提高效率 。

实现核心点:

1.构造方法私有化;

2.声明一个本类对象(静态);

3.给外部提供一个静态方法获取对象实例。  
     

饿汉式实现: 在类被加载后, 对象被创建, 到程序结束后释放 。 懒汉式实现: 在第一次调用getInstance方法时, 对象被创建,到程序结束后释放。

//饿汉式: 占用内存的时间长, 提高效率 

class Singleton1{ 

  private Singleton1(){} 

  private static Singleton1 s = new Singleton1(); 

  public static Singleton1 getInstance(){ 

    return s; 

  }

  public void print(){

    System.out.println("测试方法"); 

  }

}

//懒汉式: 占用内存的时间短, 效率低(懒加载,延迟加载)

class Singleton2{

  private Singleton2(){};

  private static Singleton2 s;

  public static Singleton2 getInstance(){

    if(s==null){

      s = new Singleton2();

    }

    return s;

  }

  public void print(){

    System.out.println("测试方法2");

  }

}

 


 




 

 

 

 

 

 

 

 

 

 

 

单例模式在实际开发中的应用:

1.在设计一些工具类的时候(通常工具类, 只有功能方法, 没有属性) ;

2.工具类可能会被频繁调用 。

 

单例懒汉式的线程安全问题:可以通过synchronized 关键字来解决多线程的线程安全问题。

public class Singleton {
  // 构造方法私有化
  private Singleton() {}

  // 将自身实例化对象设置为一个属性, 并用static修饰
  private static Singleton s;

  // 静态方法返回该实例, 加synchronized关键字实现同步
  public static synchronized Singleton getInstance() {
    if(instance == null) {
      s= new Singleton();
    }

    return s;
  }
}

 



 

 

 

 

 

 

 

但在多线程情形下, synchronized方法通常效率低, 显然这不是最佳的实现方案。 

DCL双检查锁机制(DCL: double checked locking) :单例模式的最佳实现方式。 内存占用率高, 效率高, 线程安全, 多线程操作原子性。

public class Singleton {

  // 构造方法私有化
  private Singleton() {}

  // 将自身实例化对象设置为一个属性, 并用static修饰
  private volatile static Singleton s;

  // 静态方法返回该实例
  public static Singleton getInstance() {

    // 第一次检查instance是否被实例化出来, 如果没有进入if块
    if(s== null) {
      synchronized (Singleton.class) {
        // 某个线程取得了类锁, 实例化对象前第二次检查instance是否已经被实例化出来, 如果没有, 才最终实例出对象
        if (s== null) {
          s= new Singleton();
        }
      }
    }

    return s;

  }
}

 

标签:Singleton,Java,--,private,实例,static,单例,设计模式,public
来源: https://www.cnblogs.com/manong-zhangyuanwai/p/13708417.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有