轻松理解-中高级java开发必知必会之 遇见最好的单例模式

什么是单例模式?

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

很多教程里都写不好的写法和好的写法这里我只介绍好的写法;

使用语法糖是最好的写法,站在巨人的肩膀上会减少很多问题

一、我们使用java的类级内部类和静态初始化来保证单利模式的可行性:

上面的注释非常的清楚,主要的实现思想就是

1.类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。

2.静态初始化器,由JVM来保证线程安全

* 如果你选择自己实现我想最好的办法也只能加上 synchronized 互斥锁在类上但是这样当调用量较大的时候肯定会影响程序的性能,所以使用java带来的一些语法糖是更佳的选择;

二、使用枚举类

单例的枚举实现在《Effective Java》中有提到,因为其功能完整、使用简洁、无偿地提供了序列化机制、在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化等优点,单元素的枚举类型被作者认为是实现Singleton的最佳方法。

枚举类天生自带主角光环,在Java规范中规定,每一个枚举类型极其定义的枚举变量在JVM中都是唯一的,因此在枚举类型的序列化和反序列化上,Java做了特殊的规定。

下面我们用一个枚举实现单个数据源例子来简单验证一下:

声明一个枚举,举例用于获取数据库连接:

模拟一个数据库连接类:

两次的输出结果都为true,表明两次获取返回了相同的实例,但是这个结果不具备说服力,因为这个没有在多线程的环境下测试,有兴趣的小伙伴可以自行测试下,也可以测试在多此调用下两种方式有没有什么性能上的差异,可以给我留言。

猜你喜欢

转载自blog.csdn.net/qq_34077993/article/details/83744941