设为首页 加入收藏

TOP

设计模式(1)——单例模式
2019-05-12 13:48:00 】 浏览:111
Tags:设计模式 单例 模式

一、单例设计

Singleton类中永远只会有一个实例化对象,此种代码实现的根本原理就是在于将一个类的构造方法关闭了。

当一个类中只能产生一个实例化对象的时候,就需要将构造方法封闭,封闭之后的操作通过一个静态方法取得本类的实例化对象。

    1. 构造方法私有化
    2. 本类的一个静态实例
    3. 提供一个静态方法获得本类的实例化对象

如果要想继续划分的,实际上单例设计,还分成两种类型:

·懒汉式:当第一次使用本类的对象时,在进行对象的实例化操作。

·饿汉式:一个单例类中不管是否使用,都始终维护一个实例化对象。

二、懒汉式

  1. classSingleton{
  2. privatestaticSingletoninstance=null;
  3. publicstaticSingletongetInstance(){//将instance传递到外部去
  4. if(instance==null){
  5. instance=newSingleton();
  6. }
  7. returninstance;
  8. }
  9. privateSingleton(){}
  10. publicvoidprint(){
  11. System.out.println("HelloWorld!!!");
  12. }
  13. };
  14. publicclassTest{
  15. publicstaticvoidmain(Stringargs[]){
  16. Singletons1=Singleton.getInstance();
  17. Singletons2=Singleton.getInstance();
  18. Singletons3=Singleton.getInstance();
  19. s1.print();
  20. s2.print();
  21. s3.print();
  22. }
  23. };

三、饿汉式

  1. classSingleton{
  2. privatestaticfinalSingletoninstance=newSingleton();//在内部准备好一个对象
  3. publicstaticSingletongetInstance(){//将instance传递到外部去
  4. returninstance;
  5. }
  6. privateSingleton(){}
  7. publicvoidprint(){
  8. System.out.println("HelloWorld!!!");
  9. }
  10. };
  11. publicclassTest{
  12. publicstaticvoidmain(Stringargs[]){
  13. Singletons1=Singleton.getInstance();
  14. Singletons2=Singleton.getInstance();
  15. Singletons3=Singleton.getInstance();
  16. s1.print();
  17. s2.print();
  18. s3.print();
  19. }
  20. };

四、单例模式的风险

单例模式很简单,就是在构造函数中多了加一个构造函数,访问权限是private的就可以了,这个模式是简单,但是简单中透着风险,风险?什么风险?在一个B/S项目中,每个HTTP Request请求到J2EE的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,假如现在有两个线程A和线程B,线程A执行到 instance = new Singleton() ;正在申请内存分配,可能需要0.001微秒,就在这0.001微秒之内,线程B执行到if(instance == null) 你说这个时候这个判断条件是true还是false?是true,那然后呢?线程B也往下走,于是乎就在内存中就有两个Singleton的实例了,看看是不是出问题了?
如果你这个单例是去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这才是最要命的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?

  1. publicclassSingleton{
  2. privatestaticfinalSingletonsingleton=newSingleton();
  3. //限制住不能直接产生一个实例
  4. privateSingleton(){
  5. }
  6. publicsynchronizedstaticSingletongetInstance(){
  7. returnsingleton;
  8. }
  9. }
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇5 hbase-shell +   hbase.. 下一篇java 图片压缩 缩放

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目