单例设计模式
2016-05-29 04:31
351 查看
使用单例的好处是保证在Java应用程序中,一个类Class只有一个实例存在。 使用单例的好处在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收.
单例模式下面又分两种实现形式:懒汉式,饿汉式
1.饿汉式
//饿汉式,确保内存中只存在唯一实例
public class Hungry{
//构造私有化
private Hungry(){
}
//实例化对象本身
private static Hungry hungry = new Hungry();
//增加获取实例的方法,该方法必须为静态
public static Hungry getInstance(){
return hungry;
}
}2.普通懒汉式
//懒汉式
public class Sluggard {
//构造私有化
private Sluggard(){
}
private static Sluggard sluggard = null;
//获取实例的方法,为了防止方法被同时访问,必须给该方法加锁
public static synchronized Sluggard getInstance(){
if(sluggard == null){
sluggard = new Sluggard();
}
return sluggard;
}
}
上面两段带码已经体现了单例模式的核心,但是第二中有个缺点:synchronized 比较占用系统资源,当多人同时想获得实例的时候可能会出现频繁的锁竞争从而消耗较多的系统资源,下面加以改进
//改进懒汉式
public class Sluggard {
//构造私有化
private Sluggard(){
}
private static Sluggard sluggard = null;
//获取实例的方法,为了防止方法被同时访问,必须给该方法加锁
public static Sluggard getInstance(){
if(sluggard == null){
//减小锁粒度
synchronized(Sluggard.class){
if(sluggard == null){
sluggard = new Sluggard();
}
}
}
return sluggard;
}
}
单例模式下面又分两种实现形式:懒汉式,饿汉式
1.饿汉式
//饿汉式,确保内存中只存在唯一实例
public class Hungry{
//构造私有化
private Hungry(){
}
//实例化对象本身
private static Hungry hungry = new Hungry();
//增加获取实例的方法,该方法必须为静态
public static Hungry getInstance(){
return hungry;
}
}2.普通懒汉式
//懒汉式
public class Sluggard {
//构造私有化
private Sluggard(){
}
private static Sluggard sluggard = null;
//获取实例的方法,为了防止方法被同时访问,必须给该方法加锁
public static synchronized Sluggard getInstance(){
if(sluggard == null){
sluggard = new Sluggard();
}
return sluggard;
}
}
上面两段带码已经体现了单例模式的核心,但是第二中有个缺点:synchronized 比较占用系统资源,当多人同时想获得实例的时候可能会出现频繁的锁竞争从而消耗较多的系统资源,下面加以改进
//改进懒汉式
public class Sluggard {
//构造私有化
private Sluggard(){
}
private static Sluggard sluggard = null;
//获取实例的方法,为了防止方法被同时访问,必须给该方法加锁
public static Sluggard getInstance(){
if(sluggard == null){
//减小锁粒度
synchronized(Sluggard.class){
if(sluggard == null){
sluggard = new Sluggard();
}
}
}
return sluggard;
}
}
相关文章推荐
- leetcode #50 in cpp
- mybatis枚举自动转换(通用转换处理器实现)
- mybatis枚举自动转换实现
- 一句话理解数据库索引
- 如何安装和使用Alcatraz
- leetcode #49 in cpp
- 软件开发——软技能(六、构建工具)
- VC启动窗口画面制作方法研究
- Linux---够开发过程中使用的Vim命令
- ES6学习笔记
- VC无闪烁刷屏技术的实现
- Spring集成Shiro时内存溢出的问题分析
- Javascript 对象封装的例子
- Java EE 远程客户的访问EJB实现实例(Jboss wildfly)
- 华为交换机命令
- CS231n 卷积神经网络与计算机视觉 8 手把手实现神经网络分类
- _T在C++下的使用与说明
- git版本回退
- VC中建立程序的关联文件
- VBA编程之放假倒计时器