Java 设计模式:单例模式

单例模式概述

  单例模式,在整个应用中单例类只能有一个实例,而且单例类负责创建此唯一实例。

  单例模式又可分为饿汉式单例和懒汉式单例

饿汉式单例

  饿汉式单例是指单例类在加载的时候实例已经创建好,不管此实例会不会使用都会创建。

  代码示例如下

class Singleton
{
    private static final Singleton instance = new Singleton();

    private Singleton()
    {
    }

    public static Singleton getInstance()
    {
        return instance;
    }
}

懒汉式单例

  懒汉式单例在饿汉式单例的基础上做了修改,只有在想要获取实例时单例类才会被实例化。

  代码实例如下

class Singleton
{
    private static Singleton instance = null;

    private Singleton()
    {
    }

    public static Singleton getInstance()
    {
        if (instance == null)
            instance = new Singleton();
        return instance;
    }
}

多线程下的单例模式

  上述两种单例模式实现很简单,在单线程下不会有什么问题,但是如果是在多线程的情况下有可能会出现问题。比如如下场景:有一个单例类S,线程A调用S的getInstance()创建实例,判断完instance为null但是此时由于cpu时间切片切换线程B开始执行,同样创建S类的实例调用getInstance()方法,此时判断instance依然为null线程B创建完成后切换到线程A执行,线程a 由于已经检测完所以直接创建instance实例。这种情形下S类就创建了两个实例

  在懒汉式单例形式中做修改,将创建操作放入同步代码块

class Singleton
{
    private static Singleton instance = null;

    private Singleton()
    {
    }

    public synchronized static Singleton getInstance()
    {
        if (instance == null)
            instance = new Singleton();
        return instance;
    }
}

  由于同步方法的效率问题,上述方法并不是最好的实现。

  双重检查加锁

  

 1 class Singleton
 2 {
 3     private static Singleton instance = null;
 4
 5     private Singleton()
 6     {
 7     }
 8
 9     public static Singleton getInstance()
10     {
11
12         if (instance == null)
13         {
14             synchronized (Singleton.class)
15             {
16                 if (instance == null)
17                     instance = new Singleton();
18             }
19         }
20         return instance;
21     }
22 }

  这样利用同步代码块,在只有instance为null 也就是需要创建instance的时候才去做同步处理,如果instance已经存在只需要直接返回。这样既保证了多线程情形下的单例实现,同时相比于直接使用同步方法提高了效率。

时间: 2024-12-31 06:37:44

Java 设计模式:单例模式的相关文章

Java设计模式の单例模式

-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱汉式,非线程安全 c.饱汉式,线程安全简单实现 d.线程安全 并且效率高  单例模式最优方案 3.总结 a.使用枚举的单例模式 b.使用枚举,static处调用,初始化一次 -------------------------------------------------- 1.定义 确保一个类只有

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

(3)Java设计模式-单例模式

单例模式(Singleton)是一种较为常用的设计模式,单例对象能保证在JVM虚拟中,该对象只有一个实例存在. 1.(懒汉,线程不安全) 1 //单例模式 2 public class Singleton { 3 // 私有化构造方法防止对象在外部被实例化 4 private Singleton() { 5 System.out.println("create"); 6 } 7 8 // 私有化静态实例,防止实例被外部应用 9 private static Singleton sing

Java设计模式-单例模式(Singleton)

单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销. 2.省去了new操作符,降低了系统内存的使用频率,减轻GC压力. 3.有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了.(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程. 单例

java设计模式 - 单例模式(干货)

深度讲解23种设计模式,力争每种设计模式都刨析到底.废话不多说,开始第一种设计模式 - 单例. 作者已知的单例模式有8种写法,而每一种写法,都有自身的优缺点. 1,使用频率最高的写法,废话不多说,直接上代码 /** * @author xujp * 饿汉式 静态变量 单例 */ public class Singleton implements Serializable { private static final long serialVersionUID = 1L; private fina

java设计模式--单例模式

单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例设计模式的类的构造方法私有化(采用private修饰). (2) 在其内部产生该类的实例化对象,并将其封装成private static类型. (3) 定义一个静态方法返回该类的实例. /** * 方法一 * 单例模式的实现:饿汉式,线程安全 但效率比较低 */ public class Singl

Java设计模式—单例模式和模板模式

1.单例模式方法:类构造方法私有的,类里面有个静态类对象用来保存这个类对象,并且这个类提供获取该类对象的静态方法. /** * 单例设计模式 * @author Admin * */ public class Design1 { private String name; private static Design1 d; private Design1(String name){ this.name = name; } public static Design1 getDesign(){ if(

浅析Java设计模式 - 单例模式

以下是三种单例模式的代码实现,前两者用的比较多 (言外之意 最后一种可以忽略) 1 package com.signle; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 /** 7 * 8 * @title 单例模式 9 * @Copyright Copyright (c)2016年3月9日 10 * @Company CTC 11 * @version 1.0 12 * @author ejokovic 13 * @time

转!java设计模式--单例模式

作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例. 饿汉式单例类 public class EagerSingleton { private static EagerSingleton instance = new EagerSingleton(); /** * 私有默认构造子 */ private E

Java设计模式—单例模式

Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例设计模式的类的构造方法私有化(采用private修饰). (2) 在其内部产生该类的实例化对象,并将其封装成private static类型. (3) 定义一个静态方法返回该类的实例. 一:饿汉模式 优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题:缺点是:当类Si