博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式--singleton
阅读量:4542 次
发布时间:2019-06-08

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

  单例模式是设计模式中使用最为普遍的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,确保系统中一个类只产生一个实例。在Java中这样的行为能带来两大好处:

1、对于频繁使用的对象,可以省略new操作花费的时间,这对于那些重量级的对象而言,是非常可观的一笔系统开销;

2、由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。

之所以写这个,是在面试中被问到了这个单例模式的实现方式有哪几种,相对而言,哪种单例模式最常用,当时真的是一脸懵逼,现在昨天晚上看了博客,写了一下代码实现三种单例模式,并且比较他们的优缺点

一、饿汉式单例模式

1 /** 2  * 饿汉式单例模式(饿汉式是由 the singleton instance is early created at complie time中的early音译过来的)
3 * 优点:没有加锁,执行效率会提高。
4 * 缺点:类加载时就初始化,浪费内存。 5 * 6 * @author ssc 7 * @Date 2019.03.25 8 */ 9 public class EarlySingleton {10 11 private static EarlySingleton instance = new EarlySingleton();12 13 private EarlySingleton(){14 15 }16 17 public static EarlySingleton getInstance(){18 return instance;19 }20 21 }

二、懒汉式单例模式

1 /** 2  * 懒汉式单例模式
3 * 优点:第一次调用才初始化,避免内存浪费。
4 * 缺点:必须加锁synchronized 才能保证单例,(如果两个线程同时调用getInstance方法,会出错)但加锁会影响效率。 5 * 6 * @author ssc 7 * @Date 2019.03.25 8 * 9 */10 public class LazySingleton {11 12 private static LazySingleton instance = null;13 14 private LazySingleton(){15 16 }17 18 public static synchronized LazySingleton getInstance(){19 if(instance == null){20 instance = new LazySingleton();21 }22 return instance;23 }24 }

三、登记式单例模式

1 /** 2  * 登记式模式(holder) 3  * 这种方式实现的单例同时拥有前两种方式的优点。首先getInstance()方法中没有锁,这使得在高并发环境下性能优越。
4 * 其次,只有在getInstance()方法被第一次调用时,StaticSingleton的实例才会被创建。因为这种方式巧妙的使用了内部类和类的初始化方式。
5 * 内部类SingletonHolder被声明为private,这使得我们不可能在外部访问并初始化它。而我们只可能在getInstance()内部对SingletonHolder类进行初始化,利用虚拟机的类初始化机制创建单例。 6 * 7 * @author ssc 8 * @Date 2019.03.25 9 *10 */11 public class StaticSingleton {12 13 private StaticSingleton(){14 15 }16 17 private static class SingletonHolder {18 private final static StaticSingleton instance = new StaticSingleton();19 }20 21 public static StaticSingleton getInstance(){22 return SingletonHolder.instance;23 }24 25 }

转载于:https://www.cnblogs.com/ssh-html/p/10600003.html

你可能感兴趣的文章
Java输入
查看>>
Python-ORM之sqlalchemy的简单使用
查看>>
Preserving Remote IP/Host while proxying
查看>>
跟潭州学院的强子老师学习网络爬虫---爬取全书网
查看>>
bzoj千题计划178:bzoj2425: [HAOI2010]计数
查看>>
[国家集训队2012]middle
查看>>
使用Holer远程桌面登录家里电脑和公司内网电脑
查看>>
Java数组5作业(2015-8-27)
查看>>
Nginx事件管理之epoll模块
查看>>
idea集成 MyBatis Generator 插件,自动生成dao,model,sql map文件
查看>>
用数据告诉你关于手机app的15个有趣事实
查看>>
BBC英语-adverbs of frequency
查看>>
python中的List,Tuple,Set,Dictionary
查看>>
JavaWeb 学习007-4个页面,5条sql语句(添加、查看、修改、删除)2016-12-2
查看>>
用JavaScript 来将数字转换成字符。
查看>>
扩展欧几里得算法
查看>>
java中的包装类
查看>>
采用多种算法,模拟摇奖:从1-36中随机抽出8个不重复的数字
查看>>
sp2.1 Practical aspects of Deep Learning
查看>>
java中的缓存
查看>>