-
-1 20
-
单例就是在整个应用程序运行的过程中只有一个实例,这样防止一个经常需要new的类,为了产生对象而浪费时间,大大的节省了程序执行的时间和内存的占用率,这样一来必须要考虑线程安全的问题,否则会出现异常,要坚持一个原则:程序的执行效率,看下面例子的说明:
class Singleton {
private static Singleton instance;
private static final Object syncRoot = new Object();
private Singleton() {
}
public static Singleton getInstance() {
if(instance == null) {
synchronized(syncRoot) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}其中第一个判断instance == null是为了防止在实例以被创建的情况下也进行加锁,浪费资源
而第二个判断instance == null是为了防止当有两个线程同时进入第一个判断块之后,其中只有一个线程进入了同步块,当它创建完实例后,离开同步块,释放同步锁,第二个线程就进入同步块,此时如果没有第二个判断,会再次创建实例,违背了单例模式的初衷,因此有此double check
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
- 评论(0)
发表评论 TrackBack