有的时候一些资源是只能有一个的,这时候,代表这个资源的对象就只能有一个,例如线程池。缓存等资源。
有人会说直接用全局变量来实现不就是,这种情况是可以的,但是这样是有缺点的,全局变量在程序一开始的时候就创建好对象,但是,有些资源是十分消耗资源的,这样的话浪费大量资源。
经典的模式代码如下:
public class Name
{
private staitc Name name;
private Name(){}
public static Name getInstance(){
if (name==null)
name=new Name();
return name;
}
}
需要注意的有几点:1.拥有一个全局静态变量
2.构造函数私有化
这段代码看似没有问题,但是如果在多线程中,这段代码是有出错的可能的,如果两个线程同时执行了判断,这时候就都为true,这样的话就会产生两个对象。
当然可以把getInstance()方法同步处理,但是这样无疑会降低程序的效率
可以如下处理:
public static Name getInstance(){if (name==null)
{
sychronized(Name,class)
{
if(name==null)
name=new Name();
}
}
return name;
}