单例Singleton的“懒汉式”与“饿汉式”实现方法
来源:互联网 发布:淘宝上专卖店有假货吗 编辑:程序博客网 时间:2024/05/16 19:54
所谓“懒汉式”与“饿汉式”的区别,是在与建立单例对象的时间的不同。“懒汉式”是在你真正用到的时候才去建这个单例对象:比如:有个单例对象public class Singleton{ private Singleton(){} private static Singleton singleton = null; //不建立对象 public static synchronized Singleton getInstance(){ if(singleton == null) { //先判断是否为空singleton = new Singleton (); //懒汉式做法 } return singleton ; }
}
“饿汉式”是在不管你用的用不上,一开始就建立这个单例对象:比如:有个单例对象public class Singleton{ public Singleton(){} private static Singleton singleton = new Singleton(); //建立对象public static Singleton getInstance(){
return singleton ;//直接返回单例对象 }}它有以下几个要素:
- 私有的构造方法
- 指向自己实例的私有静态引用
- 以自己实例为返回值的静态的公有的方法
Singleton 单例模式(懒汉方式和饿汉方式)
单例模式的概念:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
关键点:
1)一个类只有一个实例 这是最基本的
2)它必须自行创建这个实例
3)它必须自行向整个系统提供这个实例
----------------------------------------------------------------------------------------------------------------------------------------------------
两种实现方式:
1 懒汉模式(类加载时不初始化)
package Singleton;
public class LazySingleton {
//懒汉式单例模式
//比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢
private static LazySingleton intance = null;//静态私用成员,没有初始化
private LazySingleton()
{
//私有构造函数
}
public static synchronized LazySingleton getInstance() //静态,同步,公开访问点
{
if(intance == null)
{
intance = new LazySingleton();
}
return intance;
}
}
关键点:(代码注释上已给出)
1)构造函数定义为私有----不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象
2)成员变量为static的,没有初始化----类加载快,但访问类的唯一实例慢,static保证在自身类中获取自身对象
3)公开访问点getInstance: public和synchronized的-----public保证对外公开,同步保证多线程时的正确性(因为类变量不是在加载时初始化的)
优缺点见代码注释。
2 饿汉式单例模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)
package Singleton;
public class EagerSingleton {
//饿汉单例模式
//在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
private static EagerSingleton instance = new EagerSingleton();//静态私有成员,已初始化
private EagerSingleton()
{
//私有构造函数
}
public static EagerSingleton getInstance() //静态,不用同步(类加载时已初始化,不会有多线程的问题)
{
return instance;
}
}
关键点:(代码注释已写)
1)私有构造函数
2)静态私有成员--在类加载时已初始化
3)公开访问点getInstance-----不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回
优缺点见代码注释。
--------------------------------------------------------------------------------------------------------------------------------------------------
关于单例模式跟全局变量有什么区别,似乎也可以提供一个public的类变量和一个private的构造函数实现类似的功能。
- 单例Singleton的“懒汉式”与“饿汉式”实现方法
- singleton单例-饿汉式|懒汉式
- Singleton饿汉式与懒汉式
- 创建单例Singleton的三种方式:懒汉式、饿汉式、枚举类
- 单例懒汉式的另一种实现
- 【JAVA】设计模式之懒汉式与恶汉式的单例模式实现的方法与详解
- Java单例模式:饿汉式和懒汉式的实现
- Java单例模式:饿汉式和懒汉式的实现
- Java单例模式:饿汉式和懒汉式的实现
- Java单例模式:饿汉式和懒汉式的实现
- Java单例的实现(懒汉式和饿汉式)
- 单例模式的饿汉式与懒汉式
- 单例模式 饿汉式与懒汉式
- 黑马程序员笔记:单例模式的简单实现与两种实现方法的比较(饿汉式和懒汉式)(一)
- 黑马程序员笔记:单例模式的简单实现与两种实现方法的比较(饿汉式和懒汉式)(二)
- 单例模式的三种实现 HungrySingleton(饿汉式) LazySingleton1(懒汉式:方法级锁) LazySingleton2(懒汉式:双检查锁 有BUG)
- 懒汉式 && 饿汉式 的单例模式
- 饿汉式、懒汉式singleton模式
- IOS Layer 简析
- 利用JavaFx开发RIA桌面应用-加载等待界面设计
- 设计模式之——享元(Flyweight)模式
- DiffUtil使用总结
- iOS samba SBM协议
- 单例Singleton的“懒汉式”与“饿汉式”实现方法
- 阻止事件(取消其默认行为并阻止其传播)
- Ubuntu16.04下为chrome/firefox安装flash player插件(即chrome浏览器安装)
- iOS label自适应高度
- jquery.nestable 树型结构
- NYOJ002 括号配对问题(栈)
- Flexgrid 取记录的方式
- CSS3 基础(002_边框图)
- java线程中BLOCKED和WAITING有什么区别?