单例模式
一. 什么是单例模式
有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。
二. 单例模式的特点
1. 单例模式只能有一个实例。
2. 单例类必须创建自己的唯一实例。
3. 单例类必须向其他对象提供这一实例。
饱汉/懒汉模式
饱汉/懒汉
public class Singleton {
//本类中定义本类的对象
static Singleton singleton;
private Singleton(){
}
//非static:使用对象调用
//static: 可以通过类调用
public static Singleton getInstance(){
if(singleton==null){
//第一次调用,成员变量没有初始化,分配空间
singleton=new Singleton();
}
//返回成员变量
return singleton;
}
}
饿汉模式
饿汉
public class Singleton {
static Singleton singleton=new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return singleton;
}
}
区别
饱汉:加载类的时候不会分配空间,第一次调用分配空间
懒加载
优点:启动时不会占用过多资源
缺点:第一个用户访问时候,响应慢,用户体验差。第一次惩罚
饿汉:加载类的时候就会分配空间
这个是主流
多线程环境,饿汉是安全,饱汉不安全
饱汉/懒汉模式加锁变安全
public class Singleton {
private static Singleton singleton;
private Singleton(){}
//double check 双重判断检查
public static Singleton createInstance(){
if (singleton==null){
synchronized (SingletonRunnable.class){
if (singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
如何解决多线程不安全
synchronized 加锁关键字
1.加锁 synchronized 加在方法上面
2.同步代码块
多个线程,使用同一个锁对象
synchronized(锁对象){
//代码块
}
同步方法
public synchronized void sellTicket(){}
不想要指定锁对象,有默认的
非静态方法:就是this
静态方法:就是类的二进制字节码对象 对象.getClass() 类.class() 以后反射讲