1、单例设计模式之懒汉式
//单例设计模式懒汉式
//为什么叫做懒汉式呢,因为一开始并没有对象,只有当需要的时候才创建出来一个对象
class Singleton{
private static Singleton instance;
//构造方法私有化
private Singleton() {
super();
//this.name = name;
}
//这个就是单例设计模式中的懒汉式
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
2.单例设计模式之饿汉式
//接下来这段代码使单例设计模式的饿汉式
//为什么叫做饿汉式,是因为一开始就初始化了对象,把对象new出来,而不是当我真正需要的时候才去帮我new这个对象
class Singleton2{
private static Singleton2 instance = new Singleton2();
private Singleton2(){
super();
}
public static Singleton2 getInstance(){
return instance;
}
}
以上这两种设计模式都是线程不安全的设计模式,在实际生产应用中我们应该选择线程安全的设计模式
3.线程安全饿汉式
//线程安全饿汉式
class Singleton4{
private static Singleton4 instance = new Singleton4();
private Singleton4(){
super();
}
public static synchronized Singleton4 getInstance(){
return instance;
}
}
//这个是线程安全的懒汉式
class Singleton3{
private static Singleton3 instance = null;
private Singleton3(){
super();
}
public static synchronized Singleton3 getInstance(){
if(instance == null)
instance = new Singleton3();
return instance;
}
}
5.双重锁校验,线程安全。
//线程安全的 (双重锁校验)
//何为双重锁校验
/*
第一重锁,
当我向调用获取实例的方法的时候,这个时候一个线程过来判断对象是否初始化,如果没有初始化,则进入锁中,进行初始化操作。
第二重锁:为什么需要第二重锁,因为第一个线程初始化这个对象需要时间如果这个时候恰好有另外一个线程也调用这个方法,并且进了synchronized代码块,这里就可能会破坏单例模式,因此这里为了保证单例只能获得一个对象实例,又进行了一次判断为空的操作,提高安全性
*/
class Singleton5{
private static Singleton5 instance;
private Singleton5(){
}
public static Singleton5 getSingleton(){
if(instance==null){
synchronized(Singleton5.class){
if(instance==null){
instance = new Singleton5();
}
}
}
return instance;
}
}
6.静态内部类的单例设计模式(带有final关键字):
class Singleton6{
public static final class SingletonHolder{
private static final Singleton6 instance = new Singleton6();
}
public static Singleton6 getSingleton(){
return SingletonHolder.instance;
}
}