分为两种:懒汉式和饿汉式
饿汉式:
package single;
/**
* 单例设计模式:饿汉式
*
* @author Administrator
*
*/
public class Single {
/**
* 初始化并且私有,静态,因为下面方法要返回生成的实例,
* 但是只有静态才能调用静态资源,否则会报错。
* 因此此处需要添加static修饰
* final:让new出来的实例锁住,防止线程安全问题
*/
private static final Single SINGLE = new Single();
/** 私有构造 */
private Single(){}
/**
* 返回创建的实例对象
*
* @return 实例对象
*/
public static Single getInstance(){
return SINGLE;
}
}
懒汉式:
package single;
/**
* 单例设计模式:懒汉式
*
* @author Administrator
*
*/
public class Single {
/**
* 初始化实例对象
* 此处不能添加finale修饰
* 如果被修饰,那么single就不能被赋值
*/
private static Single SINGLE = null;
/** 私有构造方法 */
private Single(){}
/**
* 返回创建的实例对象
* 如果多个线程同时进来,并且同时卡到A点
* 那么就不会达到单例,因此需要加synchronized
*
* @return 创建的实例对象
*/
public static synchronized Single getInstance(){
if(SINGLE == null)
{
return new Single();
}
return SINGLE;
}
}
懒汉式优化(主要面试):
package single;
/**
* 单例设计模式:懒汉式
*
* @author Administrator
*
*/
public class Single {
/**
* 初始化实例对象
* 此处不能添加finale修饰
* 如果被修饰,那么single就不能被赋值
*/
private static Single SINGLE = null;
/** 私有构造方法 */
private Single(){}
/**
* 返回创建的实例对象
* 线程A拿到锁,到达C点 sleep了
* 线程B进来了到达A点,有锁,进不去,
* 线程A醒来之后,创建实例,返回
* 线程C到达D点判断,进不去,直接返回
* 线程D到达D点判断,进不去,直接返回
* 。。。。
*
*
* 这样就减少了判断锁的次数
*
* 锁:因为程序都是静态实现,在调用方法的时候并没有this
* 因此使用当前文件的.class文件
*
* @return 实例对象
*/
public static Single getInstance(){
if(SINGLE == null)
{
synchronized (Single.class) {
if(SINGLE==null){
return new Single();
}
}
}
return SINGLE;
}
}