zoukankan      html  css  js  c++  java
  • 单件模式

      说明:本文主要是作为读书笔记(Head First 设计模式),代码也来自于该书。

      我一直以为我可以很快地写出一个单件模式的代码来,也正如书中列的代码:

     1 public class Singleton{
     2     private static Singleton uniqueInstance;
     3     private Singleton(){}
     4     public static Singleton getInstance(){
     5         if(uniqueInstance==null)
     6         {
     7             uniqueInstance=new Singleton();
     8         }
     9         return uniqueInstance;
    10     }
    11 }

      这段代码在多线程的情况下就会出问题。如果有两个线程A、B,A先执行到line 5,接着B执行line 5,再切换到A执行line 7,然后切换到7执行line 7,则线程A、B会分别得到一个不同的对象,就违法了单例模式的定义了。

      书中给出了三个解决方法:

      1. getInstance方法声明为synchronized。显然,这种做法会严重影响性能。

      2. 使用"急切"创建实例,而不用延迟实例化的做法。当应用程序实际上不需要创建单件实例时,该方法就会造成浪费。

    1 public class Singleton{
    2     private static Singleton uniqueInstance=new Singleton();
    3     private Singleton(){}
    4     public static Singleton getInstance(){
    5         return uniqueInstance;
    6     }
    7 }

      3. 用"双重检查加锁"。

     1 public class Singleton{
     2     private static volatile Singleton uniqueInstance;
     3     private Singleton(){}
     4     public static Singleton getInstance(){
     5         if(uniqueInstance==null)
     6         {
     7             synchronized(Singleton.class)
     8             {
     9                 if(uniqueInstance==null)
    10                 {
    11                     uniqueInstance=new Singleton();
    12                 }
    13             }
    14         }
    15         return uniqueInstance;
    16     }
    17 }

      相比而言,方法3是较好的实现方法。

  • 相关阅读:
    深入理解递归函数的调用过程
    关于字符串和字符数组的再讨论
    返回字符串的长度
    再写静态变量的有效范围
    一道关于返回指针和返回数组名的面试题
    关于TCP/IP的三次握手和四次挥手解释
    C++面向对象的编程(二)
    关于面试宝典中的检测并修改不适合的继承
    argc和argv
    基于C的文件操作(转)
  • 原文地址:https://www.cnblogs.com/zhizhizhiyuan/p/3667615.html
Copyright © 2011-2022 走看看