总结下Java单例模式的几种写法:

1. 饿汉式

public class Singleton
{ private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() {
return instance;
} }

优点:实现简单,不存在多线程问题,直接声明一个私有对象,然后对外提供一个获取对象的方法。

缺点:class 类在被加载的时候创建Singleton实例,如果对象创建后一直没有使用,则会浪费很大的内存空间,此方法不适合创建大对象。

2. 懒汉式(线程不安全)

public class Singleton
{ private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) {
instance = new Singleton();
}
return instance;
} }

优点:节省内存空间,在使用的时候才会创建;

缺点:在多线程下,可能会创建多个实例(一定要重视这个问题,有时候如果在单例对象的构造方法中做了某些重要操作,创建多个实例可能会造成可怕后果,如:打开Android的Sqlite数据库连接)。

3. 懒汉式(线程安全)

public class Singleton
{ private static Singleton instance = null; private Singleton() {} public synchronized static Singleton getInstance() { if (instance == null) {
instance = new Singleton();
}
return instance;
} }

优点:支持多线程,且以懒汉式的方式加载,不浪费内存空间。

缺点:将 synchronized 块加在方法上,会影响并发量,每次调用getInstance()方法都会线程同步,效率十分低下。最重要的是,当创建好实例对象之后,就不必继续进行同步了。

4.懒汉式(线程安全,推荐)

public class Singleton
{ private static volatile Singleton instance = null; private Singleton() {} public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
} }

优点:支持多线程,并发量高,且以懒汉式加载,不浪费内存空间。

缺点:一时找不出缺点,非要说缺点的话,就是实现比较麻烦。

最新文章

  1. Map工具系列-07-TFS变更集提取工具
  2. C#中的LINQ
  3. saltstack命令执行过程
  4. VM虚拟机下安装Centos7.0图文教程
  5. Android studio 签名使用转
  6. lintcode:将二叉树拆成链表
  7. 在使用<script>嵌入JavaScript代码时,不要在代码中的任何地方出现"</script>"字符串
  8. [NOIP2014][DP]飞扬的小鸟
  9. JS框架设计读书笔记之-异步
  10. [POI2000]病毒
  11. 论文笔记:Auto-DeepLab: Hierarchical Neural Architecture Search for Semantic Image Segmentation
  12. Beta冲刺 4
  13. HTML一片空白, 无法渲染: Empty tag doesn't work in some browsers
  14. web前端(13)—— 了解JavaScript,JavaScript的引入方式
  15. linux 学习笔记 tail 命令
  16. [转]MyBatis动态传入表名、字段名参数的解决办法
  17. 知识点:Mysql 基本用法之事务
  18. 1.6getId()方法
  19. PowerBuilder编程新思维5:包装(界面美化与WebUI+React)
  20. pyspark dataframe 常用操作

热门文章

  1. 传统Dolev-Yao攻击模型和eCK强安全模型之间的辨析
  2. 将Maven项目部署云服务器流程
  3. 2013.6.22 - OpenNE第二天
  4. S3cmd
  5. Nginx中获取真实ip地址
  6. vuex传值的使用
  7. 题解 洛谷P3745 【[六省联考2017]期末考试】
  8. vim编辑提示存在临时文件,删除隐藏的*.swp文件即可
  9. Dynamics 365 on-premises 安装
  10. C++处理异常