在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问一个实例。
一、饿汉式静态常量
public class Singleton {
//私有构造方法
private Singleton(){
}
private final static Singleton instance=new Singleton();
public static Singleton GetInstance(){
return instance;
}
}
特点:线程安全,但是可能造成内存浪费。
二、饿汉式静态代码块
public class Singleton {
//私有构造方法
private Singleton(){
}
private static Singleton instance=null;
//在静态代码块中,创建对象
static {
instance=new Singleton();
}
public static Singleton GetInstance(){
return instance;
}
}
特点:线程安全,但是可能造成内存浪费。
三、懒汉式-线程不安全
public class Singleton {
//私有构造方法
private Singleton(){
}
private static Singleton instance;
public static Singleton GetInstance(){
if(instance == null){
instance=new Singleton();
}
return instance;
}
}
特点:实现懒加载,但是线程不安全。
四、懒汉式-线程安全
//私有构造方法
private Singleton(){
}
private static Singleton instance;
//使用synchronized
public static synchronized Singleton GetInstance(){
if(instance == null){
instance=new Singleton();
}
return instance;
}
}
特点:线程安全,但是效率太低。
五、懒汉式-线程安全,同步代码块
public class Singleton {
//私有构造方法
private Singleton(){
}
private static Singleton instance;
public static Singleton GetInstance(){
if(instance == null){
synchronized (Singleton.class){
instance=new Singleton();
}
}
return instance;
}
}
特点:并不能起到线程安全的作用
六、双重检查
public class Singleton {
//私有构造方法
private Singleton(){
}
private static Singleton instance;
public static Singleton GetInstance(){
if(instance == null){
synchronized (Singleton.class){
//保证单例
if(instance == null){
instance=new Singleton();
}
}
}
return instance;
}
}
特点:延迟加载,效率较高。
七、静态内部类模式(推荐使用)
public class Singleton {
//私有构造方法
private Singleton(){
}
public static class SingletonInstance{
private static final Singleton singleton=new Singleton();
}
public static Singleton GetInstance(){
return SingletonInstance.singleton;
}
}
特点:实现懒加载,线程安全,采用类加载机制,实现线程安全和但实例。
八、枚举模式
public enum SingletonsIngleton {
INSTANCE;
private Singleton instance;
SingletonsIngleton() {
this.instance = new Singleton();
}
public Singleton getInstance() {
return this.instance;
}
class Singleton{
}
}
特点:不仅能避免多线程同步问题,而且还能避免反序列化重新创建新对象。
评论区