博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Head First--设计模式 单件模式 独一无二的对象
阅读量:5777 次
发布时间:2019-06-18

本文共 1571 字,大约阅读时间需要 5 分钟。

  单件模式(Singleton Pattern):用来创建独一无二的,只能有一个实例的对象的入场券。

  经典的一个单件

    public class Singleton{

    private static Singleton uniqueInstance;

  private Singleton(){}

  public static Singleton getInstance(){

  if(uniqueInstance==null)

  {

     uniqueInstance=new Singleton();

  }

    return uniqueInstance;

  }

  }

  单件模式:确保一个类只有一个实例,并提供一个全局访问点。

   getInstance()方法时静态的,这意味着它是一个类方法,所以可以在代码的任何地方使用Singleton.getInstance()访问它。这和访问全局变量一样简单,只是多了一个优点:单件可以延迟实例化。

  对待getInstance()方法,我们要处理多线程情况。

  只要把getInstance()变成同步(synchronized)方法,多线程灾难几乎可以轻易解决多线程问题。

  public static synchronized Singleton getInstance(){...},这种做法的特点是:我们迫使每个线程在进入这个方法之前,要先等候别的线程离开该方法。也就是所两个线程不会同时进入这个方法。

  改善多线程的方法:

  1.如果getInstance()的性能对应用程序不是很关键,就什么也别做,就按照上面的做法使用。

  2.使用“急切”创建实例,而不用延迟实例化的做法,也就是全局变量的意思。

  public class Singleton{

  private static Singleton uniqueInstance=new Singleton();

  private Singleton(){}

  public static Singleton getInstance(){return uniueInstance;}

  }

  3.用“双重检查加锁”,在getInstance()中减少使用同步

  利用双重检查加锁(double-checked locking),首先检查是否实例化已经创建了,如果尚未创建,“才”进行同步。这样一来,只有第一次会同步,这正是我们想要的。

  public class Singleton{

  private volatile static Singleton uniueInstance;

  private Singleton(){}

  public static Singleton getInstance()

    {

    if(uniqueInstance==null)

      {

      synchronized(Singleton.class)

        {

          if(uniqueInstance==null)

          {

          uniqueInstance=new Singleton();

          }

        }

      }

    return uniqueInstance;

  }

}

  volatile关键字确保,当uniqueInstance变量被初始化成Singleton实例时,多个线程正确处理uniueInstance变量。

 

  

转载于:https://www.cnblogs.com/lufangtao/archive/2012/04/24/2468764.html

你可能感兴趣的文章
flask的文件上传和下载
查看>>
如何查看java class文件的jdk版本
查看>>
ImportError: cannot import name UnrewindableBodyError
查看>>
翻翻git之---有用的欢迎页开源库 AppIntro
查看>>
Unity Shaders and Effects Cookbook (3-5) 金属软高光
查看>>
31-hadoop-hbase-mapreduce操作hbase
查看>>
C++ 代码风格准则:POD
查看>>
PHP-Windows下搭建PHP-MSF环境【原创】
查看>>
linux-友好显示文件大小
查看>>
emplace_back() 和 push_back 的区别(转)
查看>>
【转】【WPF】WPF中MeasureOverride ArrangeOverride 的理解
查看>>
ASP、Access、80040e14、保留关键字、INSERT INTO 语句的语法错误
查看>>
【转】二叉树的非递归遍历
查看>>
NYOJ283对称排序
查看>>
接连遇到大牛
查看>>
[Cocos2d-x For WP8]矩形碰撞检测
查看>>
自己写spring boot starter
查看>>
花钱删不完负面消息
查看>>
JBPM之JPdl小叙
查看>>
(step6.1.5)hdu 1233(还是畅通工程——最小生成树)
查看>>