课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
单例模式是程序员在学习软件设计模式的时候接触和应用非常频繁的一种设计模式,而今天我们就通过案例分析来了解一下,单例模式中常见的实现方法。
1、单例模式实现
单例模式的实现方式比较多,主要在实现上是否支持懒汉模式、是否线程安全中运用各项技巧。当然也有一些场景不需要考虑懒加载也就是懒汉模式的情况,会直接使用static静态类或属性和方法的方式进行处理,供外部调用。
2、静态类使用
以上这种方式在我们平常的业务开发中非常场常见,这样静态类的方式可以在一次运行的时候直接初始化Map类,同时这里我们也不需要到延迟加载在使用。
在不需要维持任何状态下,仅仅用于全局访问,这个使用使用静态类的方式更加方便。
但如果需要被继承以及需要维持一些特定状态的情况下,就适合使用单例模式。
3、懒汉模式(线程不安全)
单例模式有一个特点就是不允许外部直接创建,也就是newSingleton_01(),因此这里在默认的构造函数上添加了私有属性private。
目前此种方式的单例确实满足了懒加载,但是如果有多个访问者同时去获取对象实例你可以想象成一堆人在抢厕所,就会造成多个同样的实例并存,从而没有达到单例的要求。
4、懒汉模式(线程安全)
此种模式虽然是安全的,但由于把锁加到方法上后,所有的访问都因需要锁占用导致资源的浪费。如果不是特殊情况下,不建议此种方式实现单例模式。
5、饿汉模式(线程安全)
此种方式与我们开头的一个实例化Map基本一致,在程序启动的时候直接运行加载,后续有外部需要使用的时候获取即可。
但此种方式并不是懒加载,也就是说无论你程序中是否用到这样的类都会在程序启动之初进行创建。
那么这种方式导致的问题就像你下载个游戏软件,可能你游戏地图还没有打开呢,但是程序已经将这些地图全部实例化。到你手机上明显体验就一开游戏内存满了,手机卡了,需要换了。
6.使用类的内部类(线程安全)
使用类的静态内部类实现的单例模式,既保证了线程安全有保证了懒加载,同时不会因为加锁的方式耗费性能。
这主要是因为JVM虚拟机可以保证多线程并发访问的正确性,也就是一个类的构造方法在多线程环境下可以被正确的加载。
此种方式也是非常推荐使用的一种单例模式
7、双重锁校验(线程安全)
双重锁的方式是方法级锁的优化,减少了部分获取实例的耗时。
同时这种方式也满足了懒加载。
8、CAS「AtomicReference」(线程安全)
java并发库提供了很多原子类来支持并发访问的数据安全性;AtomicInteger、AtomicBoolean、AtomicLong、AtomicReference。
AtomicReference<V>可以封装引用一个V实例,支持并发访问如上的单例方式就是使用了这样的一个特点。
使用CAS的好处就是不需要使用传统的加锁方式保证线程安全,而是依赖于CAS的忙等算法,依赖于底层硬件的实现,来保证线程安全。相对于其他锁的实现没有线程的切换和阻塞也就没有了额外的开销,并且可以支持较大的并发性。
当然CAS也有一个缺点就是忙等,如果一直没有获取到将会处于死循环中。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。