单例模式(Singleten Pattern)

单例模式的英文原话:Ensure a class has only one instance, and provide  a global point of access to it.

——确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式可以用在建立目录,数据库连接等需要单线程操作的场合,用于实现对系统资源的控制。

由于java语言的特点,单例模式通常有两种表现形式。

1. 饿汉式单例类:类加载时,就进行对象的实例化;

2. 懒汉式单例类:第一次引用类时,才进行对象的实例化。、

1、饿汉式单例类

Singleton
static Singleton m_instance = new Singleton()
static getInstance():Singleton
                                                      饿汉式单例类图

饿汉式单例类的源代码如下所示。


public class Singleton {
	// 在类内部就实例化
	private static Singleton m_instance = new Singleton();
	// 构造方法私有,保证外界无法直接实例化
	private Singleton() {			
	}
	// 通过该发发获得实例对象
	public static Singleton getInstance() {		
			return m_instance;	
	}
}
从上述代码中可以看到,类被加载时,静态变量m_instance会被初始化,此时类的私有构造函数会被调用,单例类的唯一实例就被创建出来了。单例类中一个显著地特点是构造函数是私有的,从而避免了外界利用构造函数直接创建出任意多的实例。另外需要注意的是,由于构造函数是私有的,因此该类不能被继承。

2.懒汉式单例类

懒汉式单例类与饿汉式单例类相同的是,类的构造函数是私有的;不同的是,懒汉式单例类在加载式不会将自己实例化,而是在第一次被调用时将自己实例化。

Singleton
static Singleton m_instance = null
static getInstance():Singleton
                                                  懒汉式单例类图

懒汉式单例类源代码:

public class Singleton {
	private static Singleton m_instance = null;
	// 构造方法私有,保证外界无法直接实例化
	private Singleton() {			
	}
	// 方法同步
	synchronized public static Singleton getInstance() {		
			if (m_instance == null) {
				
				m_instance = new Singleton();
			}
			return m_instance;
	}
}
上述代码中,烂事单例类中对静态方法getInstance()进行同步,以确保多线程环境下之创建一个实例,例如,如果getInstance()方法未被同步,并且线程A和线程B同时调用此方法,则执行if(m_instance == null)语句都为真时,那么线程A和线程B都会创建一个对象,在内存中就会出现两个对象,这样就违反了单例模式; 但使用synchronized 关键字进行同步后则不会出先此种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值