在java中,单例模式算是比较基础和简单的,今天就来简单聊聊什么是单例模式。比如说,一个应用程序中,某个类的实例对象只有一个,而我们没有办法new,因为构造器已经被private声明了,通过getInstance()的方法可以获取它们的实例。getInstance()的返回值是一个对象的引用,并不是一个新的实例,这点要注意理解,不要错误的认为是多个对象。
单例模式
代码例子:
public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) { singleton = new Singleton(); } return singleton;}}
这是最基本的写法,非常简单但是线程不安全。其实还有另外几种写法:
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
这也是基本的写法,但是这样写的线程是安全的。在这些基础的写法之上,伟大的程序员们又开发出来几种别的新花样,如:
饿汉式写法:
public class Singleton {
private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
静态内部类
public class Singleton {
private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
静态内部类
枚举
public enum Singleton {
INSTANCE; public void whateverMethod() { } }
这种方式能避免多线程同步问题,还能防止反序列化重新创建新的对象。
双重校验锁
public class Singleton {
private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
IT圈不乱
对于初学者来说,首先要弄懂最基本的写法是什么意思,然后再去尝试更多的写法,就一通百通了。有想法的朋友们,欢迎在评论区留言讨论,也可以关注我的百家号:IT圈不乱!