博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入单例模式一(转)
阅读量:2351 次
发布时间:2019-05-10

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

参考:http://blog.csdn.net/mrfly/article/details/13372441

 

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

 

 

 

 

饿汉式代码如下:

 

[java]   
 
  1. package zhaodp.demo;  
  2.   
  3. public class Singleton {  
  4.     private static Singleton uniqueInstance = null;  
  5.     public static Singleton instance(){  
  6.         if(uniqueInstance == null)  
  7.             uniqueInstance = new Singleton();  
  8.         return uniqueInstance;  
  9.     }  
  10. }  

 

设计模式的教科书上的示例一般与上述代码类似。如果在多线程环境下,instance()方法可能会出现问题,如何才能做到线程安全呢,可以将代码变成:

[java]   
 
  1. public synchronized static Singleton instance(){  
  2.     if(uniqueInstance == null)  
  3.         uniqueInstance = new Singleton();  
  4.     return uniqueInstance;  
  5. }  

将instance方法加上synchronized进行限定,确实可以解决线程安全问题,但会造成多线程调用该方法时串行执行,效率低下,如何改进呢?以下代码既可以保证线程安全又可以提高多线程并发的效率。

[java]   
 
  1. package zhaodp.demo;  
  2.   
  3. public class Singleton {  
  4.     private static Singleton uniqueInstance = null;  
  5.   
  6.     public static Singleton instance() {  
  7.         if (uniqueInstance != null)  
  8.             return uniqueInstance;  
  9.         synchronized (Singleton.class) {  
  10.             if (uniqueInstance == null)  
  11.                 uniqueInstance = new Singleton();  
  12.         }  
  13.         return uniqueInstance;  
  14.     }  
  15. }  

 

或者这么写:

[java]   
 
  1. package zhaodp.demo;  
  2.   
  3. public class Singleton {  
  4.     private static Singleton uniqueInstance = null;  
  5.   
  6.     public static Singleton instance() {  
  7.         if (uniqueInstance == null) {  
  8.             synchronized (Singleton.class) {  
  9.                 if (uniqueInstance == null)  
  10.                     uniqueInstance = new Singleton();  
  11.             }  
  12.         }  
  13.         return uniqueInstance;  
  14.     }  
  15. }  
你可能感兴趣的文章
10055自动进刀水钻机android蓝牙2.0SSP项目源码结构使用说明【版本更新、自动连接、控件批量处理、接收解析】
查看>>
Android Studio导入项目时常见问题的解决汇总,Eclipse项目转为Android Studio项目步骤报错万能解决方法汇总
查看>>
Widget.Material.Light.ProgressBar.Horizontal" (10302b8) is not a Drawable (color or path)错误解决
查看>>
解决java中文乱码,编码识别测试,汇总
查看>>
android定时,延时,倒计时源码
查看>>
Eclipse导入项目时常见问题解决汇总, Android Studio转为Eclipse项目问题汇总
查看>>
com.android.dex.DexIndexOverflowException
查看>>
AndroidStudio一个工程内查看多个项目的实现
查看>>
Gradle Build速度加快终极方法
查看>>
Could not find class 'com.umeng.analytics.d' 解决的方案分享
查看>>
谷歌游览器模拟手机请求网站测试
查看>>
在Fragment中OnActivityResult方法中接收Activity中返回的值
查看>>
外包采用Gradle生成多套app打包
查看>>
iOS和Android的app界面设计规范
查看>>
Android 代码混淆异常
查看>>
Android drawable微技巧,你所不知道的drawable的那些细节
查看>>
理解Fragment生命周期
查看>>
最靠谱的禁止ViewPager滑动方法
查看>>
android错误之android.content.res.Resources$NotFoundException:
查看>>
Android监听软键盘打开收起事件(软键盘自带收起按钮)
查看>>