为什么80%的码农都做不了架构师?>>>
单例模式(singleton):
一个类只有一个实例。(比如提高数据库的访问效率)
两种: 饿汉 懒汉
如何保证类只有一个实例?如何让外部类不能new---把构造方法搞成私有的。如下:
public class Singleton{
private Singleton(){
}
public static Singleton getInstance(){//得到实例
return new Singleton();
}
}
那么这样真的能保证只有一个实例?
Singleton s1 = Singleton.getInstance();
Singleton s1 = Singleton.getInstance();
很显然s1,s2不是同一个Singleton.
那么究竟应该怎么做?看下面的代码:
public class Singleton{
private Singleton(){
}
private static Singleton singleton = new Singleton();
public static Singleton getInstance(){//得到实例
return singleton;
}
}
这样一来,显然就只能一个了,每次调用Instrance代码,都返回静态singleton。
这种方法叫做饿汉式。下面还要讲一种叫做懒汉式的单例模式。
首先看下面代码:
public class Singleton{
private Singleton(){
}
private static Singleton singleton = null;
public static Singleton getInstance(){//得到实例
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
首先声明static singleton为空,在使用的时候在创建,这种方式叫做懒汉式。在这里,需要注意线程安全问题。
如果多线程需要访问实例,当多个线程调用Instance()方法时可能出现创建两个实例,等等问题。此处,我们要加一个线程锁synchronized。如下:
public class Singleton{
private Singleton(){
}
private static Singleton singleton = null;
public synchronized static Singleton getInstance(){//得到实例
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
注意:
在多个JVM系统的分散式系统中
在一个JVM中有多个类加载器