单例模式
使用场景
1.需要频繁创建和销毁的对象
2.创建和销毁消耗资源较大的重量级对象
3.经常用到的工具对象
饿汉(静态变量形式)
优点:简单,没有多线程同步问题(类加载的时候就实例化了对象)
缺点:没有实现懒加载,可能造成内存浪费
class Singleton01{
//构造器私有化
private Singleton01(){}
//本类内部创建静态对象实例
private final static Singleton01 instance=new Singleton01();
//提供公有的静态方法,返回实例对象
public static Singleton01 getInstance(){
return instance;
}
}
饿汉(静态代码块形式)
优点:简单,没有多线程同步问题(类加载的时候就实例化了对象)
缺点:没有实现懒加载,可能造成内存浪费
class Singleton02{
//构造器私有化
private Singleton02(){
}
private static Singleton02 instance;
//静态代码块实例化对象
static{
instance=new Singleton02();
}
//提供公有的静态方法,返回实例对象
public static Singleton02 getInstance(){
return instance;
}
}
懒汉(线程不安全)
优点:懒加载
缺点:线程不安全,只能单线程使用
class Singleton03{
public static Singleton03 instance;
//构造器私有化
private Singleton03(){
}
//公有方法,调用该方法时,创建实例
public static Singleton03 getInstance(){
if(instance==null){
instance=new Singleton03();
}
return instance;
}
}
懒汉(线程安全,对公有方法加锁)
优点:懒加载
缺点:每次调用公有方法都要受锁的影响,效率很差
class Singleton04{
public static Singleton04 instance;
//构造器私有化
private Singleton04(){
}
//公有方法,调用该方法时,创建实例,为保证线程安全,对方法加锁
public static synchronized Singleton04 getInstance(){
if(instance==null){
instance=new Singleton04();
}
return instance;
}
}
懒汉式 (线程安全,双重检查)
优点:懒加载,效率高
class Singleton05{
//volatile修改立即更新的储存
public static volatile Singleton05 instance;
//构造器私有化
private Singleton05(){
}
//公有方法,调用该方法时,进行双重检查
public static Singleton05 getInstance(){
if(instance==null){
synchronized (Singleton05.class){
if(instance==null){
instance=new Singleton05();
}
}
}
return instance;
}
}
静态内部类方式实现单例模式
class Singleton06{
//构造器私有化
private Singleton06(){
}
//静态内部类,创建实例对象
//外部类装载时,内部类不装载
private static class InnerSingletonClass{
private static final Singleton06 INSTANCE=new Singleton06();
}
//公有方法,调用该方法时,进行内部类的装载,只会装载一次,并且JVM在装载类时线程安全
public static Singleton06 getInstance(){
return InnerSingletonClass.INSTANCE;
}
}
枚举单例模式
java
enum Singleton07{
INSTANCE;
}