单例模式的 两种 经典实现

单例模式定义:确保一个类只有一个实例。并提供一个全局访问点。

在实际工作和面试中,单例模式可能是我们遇到频率比较大的设计模式之一。

下面给出两种单例模式的实现方式:

1、急切实例化的方式:

public class Singleton
{
	private static Singleton singleton = new Singleton();
	
	private Singleton()
	{
		
	}
	
	public static Singleton getInstance()
	{
		return singleton;
	}

}

 这种方式比较简单,也是比较常用的一种方式。定义变量时就实例化对象了。这样避免了多线程带来的同步问题。

2、双重检查加锁 的方式:

public class Singleton
{
	private volatile static Singleton singleton ;
	
	private Singleton()
	{
		
	}
	
	public static Singleton getInstance()
	{
		if(singleton == null)
		{
			synchronized (Singleton.class)
			{
				if(singleton == null)
				{
					singleton = new Singleton();
				}
				
			}
		}
		
		return singleton;
	}
}

 使用volatile 关键字保证了多线程情况下singleton 引用的可见性,使用双重检查锁定,只有在singleton 为空时才进行加锁操作,这样提高了程序的效率。双重检查锁定也是多线程程序中比较常见的一种加锁方式,但是这种写法不能用于jdk1.2以前的版本,因为jdk1.2版本 以前的jvm的垃圾回收机制有bug,singleton 会被当成循环引用 被回收(我猜的)。

两种写法都是非常常用的写法,希望能给面试和工作的同学一点帮助……

猜你喜欢

转载自lei6744.iteye.com/blog/1050791