------- android培训、java培训、期待与您交流! ----------
单例的作用:只能让内存中只有这一个类的存在,也就是说这个类只能有一个实例
设计的目的以及什么时候调用:优化内存,如果一个类它只有一个变量,那么它是以类存在的话,此时就可以设计成单例模式。
如何设计:
1,它不能被其他类给实例化了
2,它可以自己提供一个实例化方法
3,这个方法是静态的,要对外访问。
2种单例:
懒汉式,顾名思义,比较懒,当要用到的时候,再去加载它,不然就不给加载。
饿汉式:用到的时候就已经加载好了。
饿汉式代码:
class Singleton {
//私有,静态的类自身实例
privatestatic Singleton instance = new Singleton();
//私有的构造子(构造器,构造函数,构造方法)
privateSingleton() {
}
//公开,静态的工厂方法
publicstatic Singleton getInstance() {
returninstance;
}
}
懒汉式代码:
class Single {
//私有构造方法,不允许其他类创建对象
privateSingle() {
};
privatestatic Single instance = null;
//提供获取对象的方法
publicstatic Single getInstance() {
if(instance == null) { // 用到的时候再去加载它.
instance= new Single();
}
returninstance;
}
}
饿汉式变种
class Singleton {
//私有,静态的类自身实例
privatestatic Singleton instance = null;
static{
instance= new Singleton(); // 一出来就直接给它加载了,先把类给实例了
}
//私有的构造子(构造器,构造函数,构造方法)
privateSingleton() {
}
//公开,静态的工厂方法
publicstatic Singleton getInstance() {
returninstance;// 然后就不管是不是被调用了,反正就是先被加载了
}
}
懒汉式要注意的地方:
class Single {
/*
* 如果单例是被多条线程给执行了, 那么执行懒汉式的时候,就出现
*
* 两条线程同时执行了null的方法, 那么A线程执行等于null,实例化一个对象了,B再进来又被实例化了一条
*
* 这是不允许的,那么就要用到synchronized同步锁这个概念
*/
privateSingle() {
};
privatestatic Single instance = null;
//提供获取对象的方法
publicstatic Single getInstance() {
//提高判断锁的效率不让每次都判断
//如果是synchronized在前面的话,每次都要判断锁,效率很低。
if(instance == null)
//多线程的同步操作,锁是自身的字节码
synchronized(Single.class) {
if(instance == null)
//自己创建对象
instance= new Single();
}
returninstance;
}
}