单例模式-面试必问设计模式

概念

单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 ------维基百科
总结来说就是单利模式对外提供有且只有一个实例,并且这个实例是自己创建的。

分类

恶汉模式:顾名思义,我很饥渴,我很饿,所以你一请求,我马上给你对象。
懒汉模式:顾名思义,我是懒汉,所以我很懒,你请求的时候我得看看对象创建了没有,如果已经有现成的,我就给你现成的,因为我懒得创建,如果没有,我再给你创建一个。

代码

恶汉模式:
public class Singleton {

    private Singleton() {
    }

    private static Singleton singleton = new Singleton();

    public Singleton getSingleton() {
        return singleton;
    }

}

代码很简单,就是如上面描述的一样,你一请求我就给你,很饥渴,很饥饿。
但是也可以看出,他是线程不安全的,因此很少使用。
注意:单例模式必须私有化构造函数。

懒汉模式
	普通恶汉模式
public class Singleton {

    private Singleton() {
    }

    private static Singleton singleton = null;

    public Singleton getSingleton() {
        if(singleton == null){
            return new Singleton();
        }
        return singleton;
    }

}

普通的恶汉模式如上面描述的一样,有则返回无责创建,但是它仍然是线程不安全的,因此我们要解决这个问题,最简单的就是加锁,synchronized来保证线程安全。

恶汉加锁模式:
public class Singleton {

    private Singleton() {
    }

    private static Singleton singleton = null;

    public synchronized Singleton getSingleton() {
        if(singleton == null){
            return new Singleton();
        }
        return singleton;
    }

}

但是synchronized是个很重的锁,恶汉懒,在加锁,工作效率很低,因此我们得改造这个模式,因此引入双重锁机制,我们的volatile来了

双重锁恶汉模式:
public class Singleton {

    private Singleton() {
    }

    private volatile static Singleton singleton = null;

    public Singleton getSingleton() {
        if (singleton == null) {
            synchronized (this) {
                if (singleton == null) {
                    return new Singleton();

                }
            }
        }
        return singleton;
    }

}

volatile字段保证了对象的线程可见性,synchronized 保证了线程的安全问题,完美。

扩展:

volatile修饰的共享变量:
	两个特性:
		1 . 保证了不同线程对该变量操作的内存可见性;
		2 . 禁止指令重排序
synchronized是一种同步锁
	几个特性:
		1.synchronized 非公平锁
		2.synchronized的底层是使用操作系统的mutex lock实现的。
		3.synchronized 底层实现的为monitorenter和monitorexit指令分别对应synchronized同步块的进入和退出
		4.synchronized jdk1.6做了优化,清晰了语义

了解更多请关注微信公众【摩登猪头】,和作者互动,答疑等。公众号上准备了大量的资源等你来领取。你的关注是作者创作的动力。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值