单例模式定义:确保一个类只有一个实例。并提供一个全局访问点。
在实际工作和面试中,单例模式可能是我们遇到频率比较大的设计模式之一。
下面给出两种单例模式的实现方式:
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 会被当成循环引用 被回收(我猜的)。
两种写法都是非常常用的写法,希望能给面试和工作的同学一点帮助……