Java设计模式—单例模式

Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。

核心知识点如下:

(1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。

(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。

(3) 定义一个静态方法返回该类的实例。

一:饿汉模式

优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题;
缺点是:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。

package cn.design.singleton;

/**
 * 饿汉模式
 * 优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题;
 * 缺点是:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间
 * 从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。
 * @author 翎野君
 *
 */
public class SingletonTest {

    //将构造方法私有化,使得外部不可以访问
    //只可以从定义的getInstance方法获取实例化对象
    //防止外部通过new SingleTonTest()实例化对象
    private SingletonTest(){

    }
    /**
     * instance外部不可以直接访问,随着类加载而加载
     * static静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配
     * final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
     */
    private static final SingletonTest instance=new SingletonTest();
    //静态方法,不随对象的不同而改变
    //返回上面定义的instance对象
    public static SingletonTest getInstance(){
        return instance;
    }
    public static void main(String[] args) {
        //在当前类下是可以访问的但是其他类不可以访问private变量
        SingletonTest st=new SingletonTest();
        //其他类中这样获取
        SingletonTest st1=SingletonTest.getInstance();
    }
}

二:饱汉模式

优点是:写起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存;
缺点是:并发环境下很可能出现多个SingletonTest实例。

package cn.design.singleton;

public class SingletonTest1 {

    //将构造方法私有化防止外部通过new SingleTest1()获取对象
    private SingletonTest1(){

    }
    //饱汉模式就是吃饱了,不着急等初始化对象的时候在获取一个唯一实例
    //没有加final关键字,如果加上的话当即就要赋值
    //而饱汉模式要求动态调用的时候创建唯一实例
    private static SingletonTest1 instance;
    //定义一个静态方法等待调用的时候在对其进行对象初始化(多线程时无法保证只有一个对象)
    public static SingletonTest1 getInstance(){
        if(instance==null){
            instance=new SingletonTest1();
        }
        return instance;
    }

    public static void main(String[] args) {
        SingletonTest1 st=SingletonTest1.getInstance();
        System.out.println(st);
    }
}

三:饱汉模式的优化

优点是:使用synchronized关键字避免多线程访问时,出现多个SingletonTest实例。
缺点是:同步方法频繁调用时,效率略低。

package cn.design.singleton;

/**
 * 优化饱汉模式
 * 优点:加锁防止多线程访问时出现多个实例的问题
 * 缺点:同步方法频繁调用时,效率略低。
 * @author 翎野君
 *
 */
public class SingletonTest2 {

    private SingletonTest2(){

    }
    private static SingletonTest2 instance;
    //定义一个静态方法,调用时进行初始化
    //加上一把锁synchronized之后防止出现多线程并发调用时出现多个实例的问题
    public synchronized static SingletonTest2 getInstance(){
        if(instance==null){
            instance=new SingletonTest2();
        }
        return instance;
    }
}

四:最优方案(不考虑反射的情况)

方法四为单例模式的最佳实现。内存占用地,效率高,线程安全,多线程操作原子性。

package cn.design.singleton;

public class SingletonTest3 {

    private SingletonTest3(){

    }
    //使用volatile保证了多线程访问时instance变量的可见性,
    //避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用
    //使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用
    private static volatile SingletonTest3 instance;

    public static SingletonTest3 getInstance(){
        if(instance==null){
            ////同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
            synchronized (SingletonTest3.class) {
                System.out.println(SingletonTest3.class);
                instance=new SingletonTest3();
            }
        }
        return instance;
    }
    public static void main(String[] args) {
        SingletonTest3 st=SingletonTest3.getInstance();

    }
}
时间: 2024-08-27 12:51:46

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