单例模式:在一个程序中只有一个对象
实现步骤:
- 私有化构造函数
- 创建静态私有化属性
- 创建公共获得属性的方法
懒汉式和恶汉式
- 懒汉式
/*懒汉式 单例模式 加synchronized解决并发问题 但是这样效率就变低了/
class Sigin {
/*私有化 避免外部创建*/
private static Sigin sigin = null;
private Sigin(){}
public static synchronized Sigin getInstance(long time) throws InterruptedException {//锁方法 每个线程都在方法外竞争
/*效率不高*/
if(sigin==null){
Thread.sleep(time);
sigin = new Sigin();
}
return sigin;
}
public static Sigin getInstance2(long time) throws InterruptedException {
/*类锁 不管实例化没实例化都要争夺锁 效率不高*/
synchronized (Sigin.class){
if(sigin==null){
Thread.sleep(time);
sigin = new Sigin();
}
return sigin;
}
}
public static Sigin getInstance3(long time) throws InterruptedException {
/*创建好后就不用等了 双重检查 提高效率*/
if(null == sigin){//提高效率
/*就第一为null的时候
* Sigin.class为模板
* */
synchronized (Sigin.class){
if(sigin==null){//多线程安全
Thread.sleep(time);
sigin = new Sigin();
}
return sigin;
}
}
return sigin;
}
}
2.懒汉式
/*懒汉式 效率不高 类加载时就要实例化属性*/
class SingletonDemo{
private static SingletonDemo singletonDemo = new SingletonDemo();
private SingletonDemo(){}
public static SingletonDemo getInstance(){
return singletonDemo;
}
}
/*懒汉式
* 类在使用的时候才加载 延缓了实例化时间 加快了加载效率
* */
class SingletonDemo2{
private static class SingletonHolder{
private static SingletonDemo2 singletonDemo2 = new SingletonDemo2();
}
private SingletonDemo2(){}
public static SingletonDemo2 getInstance(){
return SingletonHolder.singletonDemo2;
}
}