首页 > 其他 > 详细

单例模式

时间:2019-05-22 00:23:27      阅读:93      评论:0      收藏:0      [点我收藏+]

一、单例模式介绍

  单例模式属于创建型模式,它提供了一种创建对象的最佳方式;

  1、目的:单例模式涉及到单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象;

  2、主要解决:一个全局使用的类频繁地创建与销毁

  3、如何解决:判断系统是否已经有这个实例化对象,如果有直接返回,如果没有则创建;

  4、核心:构造函数要求是私有的 private,这样该类就不会被实例化;

  5、优点:

[1]在内存中只有一个实例,减少了内存开销,尤其是频繁地创建和销毁实例
[2]避免对资源的多重占用

二、实现方式

  1、懒汉方式

    (1)线程不安全的懒汉式

 1 public class Singleton{
 2     private static Singleton instance = null;
 3     
 4     private Singleton(){}
 5 
 6     public static Singleton getInstance(){
 7 
 8          if(instance == null){
 9           // JVM 重排序导致的空指针问题;
10           // 1.在堆中开辟内存空间
11           // 2.在堆内存中实例化Singleton();
12           // 3.把对象指向堆空间;
13           // 由于jvm存在乱序执行功能,所以可能在2还没执行时就先执行了3,如果此时再被切换到线程B上,由于执行了3,INSTANCE 已经非空了,// 会被直接拿出来用,这样的话,就会出现异常。这个就是著名的DCL失效问题。 
14            
15                instance = new Singleton();
16          }
17 
18          return instance;
19     }        
20     
21 }            

    特性:1、延迟加载  2、非线性安全

    (2)线程安全方式

 1 public class Singleton {
 2     private static Singleton instance = null;
 3     /**
 4      * 私有化构造器,这样该类就不会被实例化;
 5      * ;
 6      */
 7     private Singleton() {
 8 
 9     }
10 
11     public static synchronized Singleton getInstance() {
12         if (instance == null) {
13             instance = new Singleton();
14         }
15         return instance;
16     }
17 }

    特性:

延迟加载
线程安全
效率低下 : 必须加锁 synchronized 才能保证单例,但加锁会影响效率
避免内存浪费 :第一次调用才初始化,避免了内存浪费;

  2、饿汉式

 1 public class Singleton {
 2 
 3     private static Singleton instance = new Singleton();
 4 
 5     /**
 6      * 私有化构造器,这样该类就不会被实例化;
 7      * ;
 8      */
 9     private Singleton() {
10     }
11 
12     public static  Singleton getInstance() {
13         return instance;
14     }
15 }

    特性:1、线程安全  2、存在内存泄漏的风险

 

单例模式

原文:https://www.cnblogs.com/kadaj174/p/10903391.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!