<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">单例模式保证在应用程序中只有一个实例,避免频繁实例化对象。</span>
public class Region {
private Region(){
}
private static Region region = null;
private static Region getInstance(){
if(region==null){
region = new Region();
}
return region;
}
}
首先构造函数要是私有的,避免被实例化(反射方式除外)。上例中,是一个简单的单例类,使用时直接调用Region.getInstance()即可。但是在多线程环境下不安全,会导致多次实例化。public class Region {
private Region(){
}
private static Region region = new Region();
private static Region getInstance(){
return region;
}
}
该方式是在系统启动的时候就初始化一个对象,虽然是线程安全的,但是并不推荐。我们最后做到在系统需要的时候再初始化,这样可以提高系统加载速度。public class Region {
private Region(){
}
private static Region region = null;
private static Region getInstance(){
synchronized (Region.class){
if(region==null){
region = new Region();
}
return region;
}
}
}
该例子是线程安全的,我们使用了synchronized关键字,也是在需要的时候初始化对象,但是每次获取对象的时候都要排队获取对象,效率肯定会低很多,我们需要的时候只有第一次加锁
public class Region {
private Region() {
}
private static Region region = null;
private static Region getInstance() {
if (region == null) {
synchronized (Region.class) {
if (region == null) {
region = new Region();
}
}
}
return region;
}
}
在该方法中,我们首先判断是否为空,如果为空再加锁进入,进入之后再判断是否为空,如果为空则实例化。实例化之后,再有线程获取对象就会直接获取实例化的对象,不需要经过锁了,效率提高很多,推荐这样写法。public class Region {
private Region() {
}
private static Region region = null;
private static class SinletonClass{
private static Region instance = new Region();
}
private static Region getInstance() {
return SinletonClass.instance;
}
}
这种模式是利用对象实例化线程安全的方式 获取对象的时候才在内部类实例化。强烈推荐这种用法!!!