
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
单例模式是许多软件编程开发项目中使用频率非常高的一种软件设计模式,而本文我们就通过案例分析来简单了解一下,单例模式设计实践方法都有哪些。
1.懒汉式(线程不安全)
描述:这是基本的实现方式,实例对象在一次被调用的时候才会被创建,属于懒加载,延迟创建单例。
优点:懒加载模式下,如果没有使用到该类,那么就不会实例化对象,节约了资源。
缺点:这种实现方式不支持多线程,这是主要的问题,因为没有加锁synchronized,无法实现线程安全。在执行if(Instance==null)时,如果多个线程同时进入,并且此时Instance为null,那么这些线程就会在执行new语句,导致多次实例化对象,这是我们不希望看到的。
2.懒汉式(线程安全)
描述:实例对象在也是一次被调用的时候才会被创建,属于懒加载,通过静态同步方法解决线程安全问题。
优点:懒加载,节约内存资源。使用同步方法,在某个时间点只能有一个线程能够进入方法,避免了多次实例化的问题,因此支持多线程,保证了线程安全。
缺点:我们希望在创建实例的时间点进行加锁同步,用静态同步方法会使得同步的范围太大,另外每次要创建对象都要争抢锁,未进入方法的线程必须等待,性能会有损耗,效率不高。
3.饿汉式(线程安全)
描述:线程不安全问题主要是由于Instance可被多次实例化,因此,在类加载时就直接实例化Instance就可以保证线程安全问题。它基于累加载机制避免了多线程的同步问题,不过这时候初始化instance显然没有达到懒加载(lazyloading)的效果。
优点:未使用同步锁,执行效率会有所提高,线程安全。
缺点:直接在类加载时自动实例化对象,失去了懒加载机制下节约资源的优势,消耗内存。
4.双重校验锁方式(线程安全)
描述:双重校验锁(double-checkedlocking,DCL)也叫双检锁,JDK1.5出现的功能。这种方式采用双锁机制,同时加锁操作只需要对实例化那部分代码进行,只有当Instance没有被实例化时(Instance==null),才需要进行加锁。
优点:懒加载,多线程环境下可保证线程安全,性能较高。
缺点:相比前几种方式,实现较为复杂。
5.静态内部类方式
描述:这种方式能达与双检锁功能相似,且实现更简单。由于静态内部类的加载是在程序中调用静态内部类的时候加载的,和外部类的加载没有必然关系,因此当Singleton类加载时,静态内部类SingletonHolder并没有被加载进内存。只有当调用getInstance()方法从而触发SingletonHolder.INSTANCE时,SingletonHolder才会被加载,此时初始化INSTANCE实例。实现了延迟加载。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
优点:延时加载,按需加载,节约资源;由于JVM提供了对线程安全的支持,只会加载一遍,线程安全得到保证。
缺点:这种方式只适用于静态域的情况。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。