单例模式实现的三种⽅式
单例模式(Singleton):
Singleton模式的要点在于⼀个类型只能被⽤来⽣成⼀个对象,且不能复制。必须要满⾜:
(1) 构造,拷贝和析构函数都是private,所以,⽆法通过声明对象来构造,
(2) 需要⽤静态成员变量来控制对象的个数,以保证不重复定义,
(3) 需要有静态的“构造”函数和“析构”函数。Singleton模式有两种⽅式:懒汉模式和饿汉模式。
⽅法⼀(懒汉模式:即第⼀次调⽤该类实例的时候才产⽣⼀个新的该类实例,并在以后仅返回此实例):需要⽤锁,来保证其线程安全性:原因:多个线程可能进⼊判断是否已经存在实例的if语句,从⽽non thread safety.使⽤double-check来保证thread safety.但是如果处理⼤量数据时,该锁才成为严重的性能瓶颈。
以下是Java实现:
public class Singleton {
private static volatile Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton ==null){//第⼀次判断
单例模式的几种实现方式
synchronized(Singleton.class){//加所
if(singleton ==null){//第⼆次判断
singleton =new Singleton();
}
}
}
return singleton;
}
}
⽅法⼆(饿汉模式:即⽆论是否调⽤该类的实例,在程序开始时就会产⽣⼀个该类的实例,并在以后仅返回此实例。):由静态初始化实例保证其线程安全性,因为静态实例初始化在程序开始时进⼊主函数之前就由主线程以单线程⽅式完成了初始化,不必担⼼多线程问题。故在性能需求较⾼时,应使⽤这种模式,避免频繁的锁争夺。
以下是Java实现:
public class Singleton {
private static Singleton singleton;
static{
instance =new Singleton();
}
private Singleton(){}
public Singleton getInstance(){
return singleton;
}
}
⽅法三(静态内部类单例)静态内部类的⽅式效果类似双检锁,但实现更简单。但这种⽅式只适⽤于静态域的情况,双检锁⽅式可在实例域需要延迟初始化时使⽤。
静态内部类在外部类加载的时候不会被加载,只有外部类中⽤到内部类时候才会被加载。 由于静态内部类没有使⽤任何锁机制,所以性能优于双重检查实现⽅式。
public class Singleton {
private Singleton(){}
private static Singleton getInstance(){
}
public static class Innerclasses {
private ststic final Singleton singleton =new Singleton(); };
};

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。