单例模式(Singleton pattern)

亦凉 2022-06-07 07:16 270阅读 0赞

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式的要点有三个:
1、某个类只能有一个实例
2、它必须自行创建这个实例
3、它必须自行向整个系统提供这个实例

下面我们来看一下一个demo
1、首先定义一个皇帝 Emperor

  1. public class Emperor {
  2. private static Emperor emperor = null;//定义一个皇帝,名字为null
  3. private Emperor(){}
  4. public static Emperor getInstance(){
  5. if(null == emperor){
  6. emperor = new Emperor();
  7. }
  8. return emperor;
  9. }
  10. public static void emperorInfo(){
  11. //为这个皇帝(Emperor)起一个名字
  12. System.out.println("【【【【【我是***皇帝】】】】】");
  13. }

2、接下来定义大臣 Minister

  1. public class Minister {
  2. public static void main(String[] args) {
  3. Emperor emperor1 = Emperor.getInstance();
  4. emperor1.emperorInfo();//第一天上朝拜见的皇帝
  5. Emperor emperor2 = Emperor.getInstance();
  6. emperor2.emperorInfo();//第二天上朝拜见的皇帝
  7. }
  8. }

每天所拜见的皇帝都是同一个皇帝 【通常情况下这样是没有问题的】
在B/S项目中每次Http请求都会在J2EE容器中创建新的线程,每个线程都要创建同一个单例对象,接下来我们分析一下这个单例模式

  1. public class Emperor {
  2. private static Emperor emperor = null;//定义一个皇帝,名字为null
  3. private Emperor(){}
  4. public Emperor getInstance(){
  5. if(this.emperor == null){
  6. this.emperor = new Emperor();
  7. }
  8. return this.emperor;
  9. }
  10. public static void emperorInfo(){
  11. //为这个皇帝(Emperor)起一个名字
  12. System.out.println("【【【【【我是***皇帝】】】】】");
  13. }
  14. }

假如同时两个Http请求(A和B)过来,线程A的请求在执行 this.emperor = new Emperor();
这句代码来分配内存时所占用的时间为0.0001秒,在这0.0001秒的同时,线程B请求执行到if(this.emperor ==
null)

此时的if 判断结果是为true,那么内存中将会产生两个 Emperor 实例对象,将会出现数据一致性校验问题,而且在调试代码时很难找出原因。接下来看一下能解决此问题的方法:

  1. //直接new一个对象传递给成员变量 singleton ,此时再调用singletonInfo() 直接返回就可以了
  2. public class Singleton {
  3. private static Singleton singleton = new Singleton();
  4. private Singleton(){}
  5. public synchronized static Singleton singletonInfo(){
  6. return singleton;
  7. }
  8. }

发表评论

表情:
评论列表 (有 0 条评论,270人围观)

还没有评论,来说两句吧...

相关阅读

    相关 模式Singleton pattern

    顾名思义,单例模式就是指一个类在内存中只有一个对象 。常见的单例模式:饿汉式,懒汉式,静态内部类,还有一种不常见的利用枚举来实现; 饿汉式:在类加载时就创建好了对象;优点:多

    相关 模式(Singleton pattern)

    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节