单例模式的几种实现方式
来源:互联网 发布:mac 制作吉他谱的软件 编辑:程序博客网 时间:2024/05/29 04:45
public class SingleObject{// 创建 SingleObject 的一个对象 private static SingleObject instance = new SingleObject();// 构造函数私有化 private SIngleObject(){}//获取唯一可用的对象 public static SingleObject getInstance(){ return instance; }}
单例模式的几种实现方式:
1 . 懒汉式 , 线程不安全
描述 : 这种方式是最基本的实现方式 , 这种实现最大的问题就是不支持多线程,因为没有加锁
synchronized , 所以严格意义上 它并不算单例
public class Singleton{ private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance ==null){ instance = new Singleton(); } return instance; }}
2.懒汉式 , 线程安全的
描述 : 这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)。
代码示例
public class Singleton{ private static Singleton instance; private static synchronized Singleton (){ if(instance == null){ instance = new Singleton(); } return instance ; }}
- 饿汉式
描述:这种方式比较常用,但容易产生垃圾对象。
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
它基于 classloder 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。
public class Singletion{ private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance(){ return instance; }}
- 双检锁 / 双重锁 (DLC , 即 double-checked locking
描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
getInstance() 的性能对应用程序很关键。
public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance(){ if(instance ==null){ synchronized (Singleton.class){ if(instance ==null){ instance = new Singleton(); } } } return instance; }}
阅读全文
0 0
- 单例模式几种实现方式
- 单例模式的几种实现方式的对比
- 单例模式singleton的几种实现方式
- 单例模式的几种实现方式
- 单例模式的几种实现方式
- 单例模式的几种实现方式比较
- C#单例模式的几种实现方式
- 单例模式的几种实现方式总结
- 常用设计模式-单例的几种实现方式
- 单例模式的几种实现方式
- 单例模式的几种实现方式
- Java单例模式的几种实现方式
- 单例模式的几种实现方式
- 单例模式的几种实现方式
- 单例模式实现的几种方式
- 单例模式的几种实现方式
- 单例模式的几种实现方式
- 单例模式的几种实现方式
- 【Linux学习笔记】35:登录时生效的环境变量配置文件 下
- Hdu 1540 Tunnel Warfare【线段树区间合并学习】
- 不能建包src/main/java问题
- 我要向你表个白哟!
- Struts2-简单Ajax应用
- 单例模式的几种实现方式
- 使用dd命令增加swap(虚拟内存)大小
- ADB主动升级命令
- 6、class的基本使用—ES6学习笔记
- CentOS7.2 chrony替代ntp搭建时间服务器
- (连接)池参数配置的核心含义
- 19. 示波器的使用
- 关于一款游戏的无责任猜想
- MySQL 5.7 (2GTID,binlog)