单例模式一二三

单例模式干的事情很简单,就是要保证某一个对象全局唯一。

对吗? 对不对要看标准

单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,

这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。

看来我之前定义的不全对。

第一 保证类只有一个实例

第二 类本身自己实例化(意思就是不能让别的类来new自己)

第三 提供全局访问的方法

OK 那我现在写出第一种Singleton

第一种Singleton

public class Singleton{
    private static Singleton sl;
    private Singleton(){
       System.out.println("初始化");
    }

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

    public static void main(String[] args){
        Singleton sl=Singleton.getInstance();
        Singleton sl2=Singleton.getInstance();
    }
}

运行结果是显示一个初始化

但是这里存在一个问题 如果多个线程同时运行这段代码,当第一个线程运行到sl=new Singleton()时(这一句还没有执行),第二个线程检查sl还是为null的,此时第二个线程也进来了... 然后就有多个对象了。

所以有

第二种Singleton

/***
 * 饿汉模式
 */
public class Singleton2{
    private final static Singleton2  sl2=new Singleton2();
    private Singleton2(){
        System.out.println("初始化");
    }
    public static Singleton2 getInstance(){
        return sl2;
    }
    public static void main(String[] args){
        Singleton2 sl2=Singleton2.getInstance();
        Singleton2 sl3=Singleton2.getInstance();
    }
}

这种单例模式,我们在类加载的时候,就把类变量new出来。这种方式我们称之为饿汉模式。

首先饿汉问题解决了上面的线程问题。我最开始加载的时候就有了类变量了并且还只有一个,自然不会存在线程问题了。

但这里有个性能问题,不管我用不用这个单例类,它总会被加载内存中,因此性能是个问题。

上面说了这个模式叫饿汉模式,那自然有非饿汉模式(术语叫懒汉模式)。不过在这里我不太想和大家聊懒汉模式,太复杂,且不怎么用。

那有没有一种单例,既能解决第一个的线程问题,同时保持性能(其实第二种饿汉模式就不错了,就那一个类,能拖多少性能?就算有10个,100个也不是太多)呢?而且也不像我说的那个"懒汉模式"那么复杂呢?

答案是肯定的。有!

内部类模式

public class Singleton3{
    private static class hold{
        private  final static Singleton3 sl3=new Singleton3();
    }
    private Singleton3(){
    System.out.println("初始化");
    }
    public static Singleton3 getInstance(){
          return hold.sl3;
    }
    public static void main(String[] args){
             Singleton3 sl3=Singleton3.getInstance();
         Singleton3 sl4=Singleton3.getInstance();
         System.out.println(sl3==sl4);
    }
}

关于内部类与static,final的分析,我们这里暂时不讲。

内部类的方式解决了上面所提的几个问题。

但也引出了一个不是问题的问题

内部类是java支持的,但是在别的语言中,不一定。

参考资料

http://blog.csdn.net/lovelion/article/details/7420883

时间: 2024-10-05 16:45:20

单例模式一二三的相关文章

java单例模式的个人理解

下面是我个人对java单例模式的个人理解 java单例设计模式是先辈们走过很多弯路才写出来的一些方法模式,总共有二三种模式.单线程:只有这个属性为null时才能创建,构造函数私有,确保每次都只创建一个,避免重复创建.缺点:只在单线程的情况下正常运行,在多线程的情况下,就会出问题.例如:当两个线程同时运行到判断instance是否为空的if语句,并且instance确实没有创建好时,那么两个线程都会创建一个实例. 双线程:当两个线程同时想创建实例,由于在一个时刻只有一个线程能得到同步锁,当第一个线

Java设计模式学习笔记,一:单例模式

开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的笔记,记录下来,只记干货. 第一部分:单例模式的内容 单例模式:类只能有一个实例. 类的特点:1.私有构造器:2.内部构造实例对象:3.对外提供获取唯一实例的public方法. 常见的单例模式实现有五种形式: 1.饿汉式. 2.懒汉式. 3.双重检查锁式. 4.静态内部类式. 5.枚举式. 以下分别

【python之路33】开发模式单例模式

1.单例模式指的是创建单个实例,例如:数据库连接池中包含10个数据库连接,用户访问数据时随机从连接池中拿出一个进行连接,其他用户再次访问时不再创建对象进行连接 #!usr/bin/env python # -*- coding:utf-8 -*- class ConnecttionPool: __instance = None def __init__(self): self.ip = '222.133.177.67' self.port = '3306' self.username = 'od

.Net 单例模式(Singleton)

每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中.每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况.每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用. 问题描述: 单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这

设计模式(一)----单例模式

单例模式其实就是每次实例化时都会得到一个相同的对象. 单例模式的写法有个简单的口诀:三私一公即一个私有的静态属性,私有的构造方法,私有的克隆方法还有一个公共的静态方法. <?phpclass Cat{ //私有的静态属性 private static $instance; //私有的构造方法 private function __construct(){ echo "这是一个单例模式"; } //公共的静态方法 public static function getInstance

Qt中单例模式的实现(4种方法)

最简单的写法: 12345 static MyClass* MyClass::Instance(){ static MyClass inst; return &inst;} 过去很长一段时间一直都这么写,简单粗暴有效.但是直接声明静态对象会使编译出的可执行文件增大,也有可能出现其他的一些问题,所以利用了Qt自带的智能指针QScopedPointer和线程锁QMutex,改成了需要时才动态初始化的模式: 12345678910111213 static MyClass* MyClass::Inst

设计模式之单例模式

单例模式是软件开发中非常普遍的一种模式.它的主要作用是确保系统中,始终只存在一个类的实例对象. 这样做的好处有两点: 1.对于需要频繁使用的对象,在每次使用时,如果都需要重新创建,并且这些对象的内容都是一样的.则不但提高了jvm的性能开销(堆中开辟新地址,同时降低GC效率等),同时还会降低代码的运行效率.倘若始终在堆中只存在唯一的一个实例对象.任何方法在使用时,均直接访问这个实例对象,则大大提高了系统的运行效率. 2.可以更好的维护对象,倘若系统中存在多个相同的实例对象,而一旦这些实例对象的属性

设计模式之单例模式(c++)

问题描述 Singleton 模式解决问题十分常见, 我们怎样去创建一个唯一的变量( 对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象) 来实现,在面向对象和面向过程结合的设计范式(如C++中)中,我们也还是可以通过一个全局变量实现这一点.但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过Singleton模式来实现了,可能这也正是很多公司在招聘 Java 开发人员时候经常考察Singleton 模式的缘故吧. (全局变量在项目中是能不用就不用的,它是一个定时炸弹,是一个不

设计模式一(单例模式)

单例模式:所谓单例模式就是确保类只有一个对象,并提供一个公共的访问接口.下面根据概念分析单例模式. 1.确保一个实例,就是不让程序随处可以new一个对象,这个怎么实现呢?运用私有构造函数. public class Singleton { private Singleton() { } } 这样Singleton就不能new对象了. 2.唯一的对象在何处?在内部定义一个静态的Singleton对象,为什么要定义静态的呢,因为静态对象属于类.然后提供一个公共的访问接口即可 public class