java中单例模式singleton

单例模式:在上下文中只有一个对象的实例。

应用场景:线程池,缓存等一个系统只需要一个的场景。

三种常见单例模式:

1. 延迟加载

public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton() {}

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

使用时通过调用类的静态方法来获取:

Singleton singleton =Singleton.getInstance();

存在问题:多线程同步问题

多线程在第一次生成对象时,存在同时执行 if (uniqueInstance == null) 判断的可能,从而同时多次 new实例

改进:

public class SynSingleton {
    private static SynSingleton uniqueInstance;

    private SynSingleton() {}

    public static synchronized SynSingleton getInstance() {
        if (uniqueInstance == null)
            uniqueInstance = new SynSingleton();
        return uniqueInstance;
    }
}

如此通过synchronized代码块的方式,实现同步。

2. 急切实例化

上述方式每次在获取对象时,都要做同步synchronized操作,开销较大,而同步操作仅在第一次new时有效(随后每次调用均不做new操作,相当于只读不写),因此可以在类加载时就new对象,随后则不在做new操作,改进如下:

public class UrgSingleton {
    private static UrgSingleton uniqueInstance = new UrgSingleton();
    private UrgSingleton() {}

    public static UrgSingleton getInstance() {
        return uniqueInstance;
    }
}

延迟实例化与急切实例化的优缺点也较明显:

如果此对象开销较大,而整个过程又没有利用,则急切实例化出来的对象,白白消耗了资源。

而延时实例化同步问题,存在开销较大的情况,于是有了 下面的双重检查加锁方式。

3. 双重检查加锁

public class DoubleSynSingleton {
    private static volatile DouleSynSingleton uniqueInstance;

    private DoubleSynSingleton() {}
    public static DoubleSynSingleton getInstance() {
        if (uniqueInstance == null) {
            synchronized(DoubleSynSingleton.class) {
                if(uniqueInstance == null)
                    uniqueInstance = new DoubleSynSingleton();
            }
        }
        return uniqueInstance;
    }
}

如上所示,仅当第一次new对象时,使用synchronized方法,随后获取对象实例时都在外层的 if (uniqueInstance == null) 判断后完成退出,不要随后的同步代码块。如此,性能得到提升。

时间: 2024-09-30 20:42:53

java中单例模式singleton的相关文章

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

深刻理解Java中单例模式的实现

在之前的学习笔记中已经写了一篇关于单例模式的几种不同实现.这篇文章主要是对之前的那篇笔记的补充和加深. · 在Java语言中使用单例模式能够带来的好处: (1):对于频繁使用的对象,可以省略创建对象那个所花费的时间,尤其是那些重量级对象的创建,对于重量级对象的创建那可是一笔相当可观的系统开销. (2):由于new操作的次数减少了,进一步产生的益处就是,对系统内存的使用频率也会降低了,那么这一举措将会减轻GC压力,缩短GC停顿时间. 以上的这两点都为系统性能的优化带来了改善. 单例模式的实现: 简

JAVA中单例模式的几种实现方式

1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线 程安全就不会使用这种方式.但是如果不需要保证线程安全,则这种方式还是不错的,因为所需要的开销比较小.下面是具体的实现代码: 转http://www.cnblogs.com/CodeGuy/p/3580486.html public Class Singleton { private static Singleton instance

Java之单例模式(Singleton)

摘要: 1.Singleton模式作用:保证在Java应用程序中,一个Class只有一个实例存在 2.Singleton的第一种形式:饿汉式单例模式 (1) 构造函数私有 (2)有一个static 的private的该类的变量 (3)通过一个public getInstance的方法获取对它的引用 代码如下: 1 package com.ggzhang.Test; 2 3 public class Singleton { 4 5 private Singleton() { 6 7 } 8 9 p

JAVA设计模式-单例模式(Singleton)线程安全与效率

一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式进行探索的. 本文的目的是:结合文章中的八种单例模式的写法,使用实际的示例,来演示线程安全和效率 既然是实际的示例,那么就首先定义一个业务场景:购票.大家都知道在春运的时候,抢票是非常激烈的.有可能同一张票就同时又成百上千的人同时在抢.这就对代码逻辑的要求很高了,即不能把同一张票多次出售,也不能出现

Java的单例模式(singleton)

为什么需要单例?只因为国家的独生子女政策(当然现在可以生2个) 单例是一个很孤独的物种,因为它的类里面做多只有也仅只有它一个. 常见的是懒汉及饿汉模式, 1.懒汉,为什么这么叫,看看英文,原为lazy loading,lazy(懒惰的),laoding(音如同佬),叫懒佬,然后一个佬==一条汉子,为好听,故懒汉. 最基础的懒汉模式: //单例模式 public class Singleton { // 私有化构造方法,使得外部不可能有由new产生实例: private Singleton() {

Java基础知识强化13:Java中单例模式案例使用

1.古往今来历史上皇帝通常只有一人.为了保证其唯一性,古人采用增加"防伪标识"的办法,如玉玺.更为简单的办法就是限制皇帝的创建.本案例中就是使用单例模式从而保证皇帝的唯一性.实例运行如下:代码: (1)Empreror.java:*(定义的皇帝类) 1 package himi.only; 2 3 public class Empreror { 4 private static Empreror empreror = null; 5 private Empreror() { 6 7 }

一天一个设计模式(二) -单例模式(Singleton)

前言 单例模式 (Singleton) 是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 正文 (一). 优缺点 Java中单例模式 (Singleton) 是一种广泛使用的设计模式.单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在.一些管理器和控制器常被设计成单例模式. 1. 优点 提供了对唯一实例的受控访问. 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象

java中的单例模式与静态类

单例模式与静态类(一个类,所有方法为静态方法)是另一个非常有趣的问题,在<Java中有关单例模式的面试问题>博文中露掉了,由于单例模式和静态类都具有良好的访问性,它们之间有许多相似之处,例如,两者可以直接使用而无须创建对象,都可提交唯一实例,在一个非常高的高度上看起来它们都为是用于同样的任务.由于它们具有较多的相似性,面试官常常会问一些类似为神马使用单例模式替换静态方法?你能使用静态类替换单例模式吗?Java中单例模式与静态的区别有那些?等这样的问题,为回答这些问题,记住他们单例模式和静态方法