
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
单例模式是软件开发程序员在学习软件设计模式的时候使用频率非常高的一个设计模式,下面我们就通过案例分析来了解一下,单例模式都有哪些类型。
1、饿汉式(静态常量)
优缺点
优点:这种写法比较简单,就是在类装载的时候就完成实例化,避免了线程同步问题。
缺点:在类装载的时候就完成实例化,没有达到LazyLoading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。
结论:这种单例模式可用,但是可能造成内存浪费
2、饿汉式(静态代码块)
优缺点
优缺点:这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。
结论:这种单例模式可用,但是可能造成内存浪费。
3、懒汉式(线程不安全)
优缺点
起到了LazingLoading的效果(使用时才创建),但是只能在单线程下使用。
如果在多线程下,多个线程同时判断singleton为null,会创建多个实例。
结论:在实际开发中,不要使用这种方式创建
4、懒汉式(线程安全,同步方法)
优缺点
采用同步方法关键字synchronized解决线程安全问题
效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。
结论:实际开发中,不推荐使用这种方式
5、懒汉式(线程不安全,同步代码块)
优缺点
这种方式本意是想对6方法进行改进,因为前面同步方法效率太低了,改为同步产生实例化的代码块
但是这种同步并不能起到线程同步的作用(解决不了线程安全的问题)。因为同样如果多个线程进行判断singleton为null时,虽然会在synchronized方法外被阻塞,但是阻塞完成之后还是会继续执行产生多个不同实例对象
结论:在实际开发中,不能使用这种方式
6、双重检查
优缺点
if判断能提升创建效率,如果去掉,多线程会阻塞;
if判断能解决线程安全问题,如果去掉会有多个线程进入synchronized代码块中创建;
synchronized方法能保顺序执行,如果去掉也会创建多个实例;
volatile关键字能保证可见性和禁止指令重排,详细点击Volatile的应用DCL单例模式
结论:实现了线程安全;延迟加载;效率较高。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。