单例模式

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点
使用场景:
a.要求产生唯一序列号
b.web中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来
c.创建的一个对象需要消耗的资源过多,比如I/O与数据库的连接等

单例模式的几种实现方式
1、懒汉式(多线程不安全)
public class Singleton{
private static Singleton instance;
private Singleton(){}//构造函数为private,该类就不会被实例化
public static Singleton getInstance(){
if(instancenull){
instance=new Singleton();
}
return instance;
}
}
描述:多线程下不能正常工作
2、懒汉式(多线程安全,使用synchronized)
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance
null){
instance=new Singleton();
}
return instance;}
}
描述:效率低
3、饿汉式(多线程安全)
public class Singleton{
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
描述:效率高,但容易产生垃圾对象,在类加载时就初始化,浪费内存
4、双重锁/双重校验锁(double-checked locking,多线程安全,使用volatile和synchronized)
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){}
public static Single getSingleton(){
if(singletonnull){
synchronized(Singleton.class){
if(singleton
null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
5、登记式/静态内部类(多线程安全)
public class Singleton{
private static class SingletonHolder{
private static final Singleton INSTANCE=new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SinglrtonHolder.INSTANCE;
}
}
6、枚举(多线程安全)
public enum Singleton{
INSTANCE;
public void whateverMethod(){
}
}

posted @ 2020-11-17 13:59  走过路过哭过  阅读(101)  评论(0)    收藏  举报