`
wanglei6744
  • 浏览: 25588 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

单例模式的 两种 经典实现

阅读更多

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

 

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

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

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 会被当成循环引用 被回收(我猜的)。

 

 

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics