完美的单例模式创建

  今天把设计模式拿出来看了下,发现以前对于单例模式的理解很是肤浅,没考虑线程安全,在考虑了线程安全的情况下又没考虑性能,当然我遇到的系统都不怎么考虑并发性能,所以其实也无所谓,当看到单例模式的时候,上网搜索了下,发下一片很好的帖子,我把其中的单例模式整理了下,给了个结果出来。

  帖子地址:http://blog.csdn.net/zhangerqing/article/details/8194653

  前提都是在考虑线程安全的情况下,可以有两种情况。分别是懒汉式和饿汉式的一种实现。

  1.性能不太好,每次锁对象,当然如果你遇到的跟我遇到的系统都一样不考虑性能问题,其实这么做也没问题,但是不好。正如Oracle高级编程里面所说的那样,你的sql能正确的完成任务,但并不代表他能很好的完成任务。

  2.我们只希望在第一次getInstance的时候去实例化对象,这个就做到了,并且线程安全,但是如果类加载的时候出问题还是有可能出问题,所以借用那篇帖子里说的,要完成完美的实现是不可能的,我们只能根据实际情况来选择合适的方式。

  1.直接锁整个对象,保证线程安全,但是由于每次获取都会锁对象,性能不好,也不是我们希望的。

package singlePattern;

/**
 * Thread safe single pattern, but performance is poor, because every time we will lock the instance,
 * we hope lock the instance on first time but all times
 *
 * @author Administrator
 *
 */
public class SinglePattern {

    // private instance
    private static SinglePattern instance = null;

    // private constructor
    private SinglePattern() {
    }

    // public getInstance method
    public synchronized static SinglePattern getInstance() {
        if (instance == null) {
            instance = new SinglePattern();
        }
        return instance;
    }
}

  2.我们需要的情形是在第一次初始化需要同步,之后的调用就不需要考虑线程同步。由于JVM在加载类的时候是互斥的,我们知道类加载器在加载类的时候会直接把静态变量和静态代码块执行一次,然后再去去调用普通代码快,然后去调用构造方法初始化堆,然后在返回引用赋值给栈里面的引用。于是我们可以利用类加载的静态变量和静态代码块来安全的构造单例实例。

  

package singlePattern;

/**
 * Thread safe and performance good.
 * @author Administrator
 *
 */
public class UserSinglePattern {

    // private constructor
    private UserSinglePattern() {}

    // static inner class, for create a single pattern instance
    private static class NewInstance {
        private static UserSinglePattern instance = new UserSinglePattern();
    }

    // the get method for single pattern instance
    public static UserSinglePattern getInstance() {
        return NewInstance.instance;
    }
}

再贴下我参考的地址对作者表示感谢:http://blog.csdn.net/zhangerqing/article/details/8194653

  

完美的单例模式创建,布布扣,bubuko.com

时间: 2024-10-12 09:06:53

完美的单例模式创建的相关文章

如何创建一个完美的单例模式

单例模式的目的是什么 单例类的目的是控制对象创建,约束对象的数量有且只有一个.单例模式只允许有一个入口来创建类的实例. 因为只有一个单例类的实例,任何单例类的实例都将之会产生一个类,就像静态域.当你需要控制资源的时候,如何数据库连接池.线程池或者使用sockets,单例模式是非常有用的. 下面我们来创建一个单例类. 创建单例类 为了实现单例类,最简单的方式就是将构造器私有化设置为private.有两种初始化方式 饿汉式 饿汉式初始化,单例类的实例在类加载的时候被创建,这是创建单例类最简单的方法.

在java中写出完美的单例模式

1. 前言 单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现的--基本上每个开发者都能够随手写出--但是,真的是这样吗? 作为一个Java开发者,也许你觉得自己对单例模式的了解已经足够多了.我并不想危言耸听说一定还有你不知道的--毕竟我自己的了解也的确有限,但究竟你自己了解的程度到底怎样呢?往下看,我们一起来聊聊看~ 2. 什么是单例? 单例对象的类必须保证只有一个实例存在--这是维基百科上对单例的定义,这也可以作为对意图实现单例模式的代码进行检验的标准. 对单

单例模式创建的三种方式

一.单例模式的好处 1.对于频繁使用的对象,可以省略new操作花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销: 2.由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间. 二.创建方式 1)饿汉式 1 public class Singleton { 2     private Singleton(){ 3         System.out.println("Singleton is create"); 4     } 5 

单例模式---创建型模式

转载:http://cantellow.iteye.com/blog/838473 Java代码   public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这

API开发第三篇:PHP的设计模式之完美的单例模式

今天来说一说单例模式. 由于我以前是做java开发的,在使用单例模式的时候,首先想到的想用饿汉式,然后发现在PHP中,有这样一个特性:因为PHP不支持在类定义时给类的成员变量赋予非基本类型的值.如表达式,new操作等等.所以了饿汉式这个就不行了.转而想要确保这个单例模式的原子性,发现PHP中也没有像JAVA中的线程安全问题.嘿嘿,你说PHP好不好?那么OK接下来就试试PHP的懒汉式单例模式了. 先不说,我先上我第一个版本的单例模式代码: // 定义私有静态变量.此种方式为:懒汉式单例(PHP中只

完美的单例模式(The Perfect Singleton)

The PerfectSingleton 我不时遇到那些事实上不确定他们应该如何合适地实现单例模式的Java程序员. 我不考虑在线程的环境中合适的实现.但是使用你能在网络上找到的大多数常见的实现方式,你可以轻松地创建你想要的多种单例实现. 假设你有下面这种常见的单例的实现: public final class NonSafeSingletonimplements Serializable { private static final NonSafeSingleton INSTANCE = ne

【原】ios下比较完美的单例模式,已验证

网上关于ios单例模式实现的帖子已经很多了,有很多版本,里面有对的也有不对的.我在使用过程中很难找到一个比较完美的方法,索性自己写一个吧,经过项目验证是比较合理的一个版本. static PRAutoLoginView *s_sharedInstance = nil; + (PRAutoLoginView *)shareInstance { @synchronized(self) { if (s_sharedInstance == nil) { s_sharedInstance = [[[sel

单例模式--创建型设计模式

1.饿汉式 优点:线程安全 缺点:立即加载 2.懒汉式 优点:懒加载 缺点:线程不安全(可以用双重锁机制来保证线程安全,但是调用效率低) 3.内部类型单例模式,前两种基本不用,因为这种包含前两种的优点 优点:1.线程安全,2.懒加载 代码如下: package sington; public class InnerSing { private InnerSing(){ } public static InnerSing getIntance(){ return InnerClass.instan

python使用单例模式创建MySQL链接

代码: from functools import wraps import mysql.connector from sshtunnel import SSHTunnelForwarder def singleton(cls): instances = {} @wraps(cls) def get_instance(*args, **kw): if cls not in instances: instances[cls] = cls(*args, **kw) return instances[