前几天面试一个校招的小朋友,让他写单例模式,没写出来,所以这里把两年前我的学习笔记发一下。这应该是所有设计模式中最简单的设计模式了,从它讲起。
用来创建独一无二对象。确保只有一个实例,并且提供一个全局访问点(getSingleton)。
/**
* Created by Acceml on 2016/5/28.
* Email: huminghit@gmail.com
*/
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getSingleton() {
if(singleton == null) {//risk
return new Singleton();
}
return singleton;
}
}
要注意的点是:
这样写的问题是: 多线程的时候回出问题,比如我们有两个线程thread0,thread1去同时调用getSingleton()这个方法,就会在if(singleton == null)出现问题。thread0,thread1都认为没有该判断为true,就会去创建两个对象,没有多线程的时候,这样使用没有问题。
/**
* Created by Acceml on 2016/5/28.
* Email: huminghit@gmail.com
*/
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {
}
public static Singleton getSingleton() {
if(singleton == null) {//判断1
synchronized (Singleton.class) {
if(singleton == null) {//判断2
singleton = new Singleton();
}
}
}
return singleton;
}
}
变化有:
上面两种方法都是我们需要的时候去做判断,然后实例化,如果创建对象负担不重的话,可以考虑在静态初始化的时候创建对象。
/**
* Created by Acceml on 2016/5/28.
* Email: huminghit@gmail.com
*/
public class Singleton {
private volatile static Singleton singleton = new Singleton();
private Singleton() {
}
public static Singleton getSingleton() {
return singleton;
}
}
本文分享自 Leetcode名企之路 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!