0%

单例模式总结

要点:

1.是某个类只能有一个实例, 构造器私有化

2.是它必须自行创建这个实例,含有一个该类的静态变量来保存这个唯一的实例

3.是它必须自行向整个系统提供这个实例,对外提供获取该实例对象的方式:直接暴露、用静态变量的get方法获取

常见形式:

饿汉式:直接创建对象,不存在线程安全问题

懒汉式:延迟创建对象,用的时候创建

简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//懒汉式-线程安全的懒汉式,可以在静态方法后面加synchronized关键字加锁变为安全
public class Singleton{
//将自身实例化对象设置为一个属性,并用static修饰
private static Singleton instance;
//构造方法私有化
private Singleton(){ }
//静态方法返回该实例
public static (synchronized) Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instane;
}
}

//饿汉式
public class Singleton{
//直接创建对象
private static Singleton instance=new Singleton();
//构造方法私有化
private Singleton(){ }
//静态方法返回该实例
public static Singleton getInstance(){
return instance;
}
}

//静态内部类
public class Singleton{
private static class SingletonHolder{
private static final Singleton INSTANCE=new Singleton();
}
private Singleton(){ }
private static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}

//枚举
public enum Singleton{
INSTANCE;
public void whateverMethod(){}
}

//双重校验锁
public class Singleton{
//将自身实例化对象设置为一个属性,并用static修饰
private static Singleton instance;
//构造方法私有化
private Singleton(){}
//静态方法返回该实例
public static Singleton getInstance(){
// 第一次检查instance是否被实例化出来,如果没有进入if块
if(instance==null){
synchronized(Singleton.class){
// 某个线程取得了类锁,实例化对象前第二次检查instance是否已经被实例化出来,如果没有,才最终实例出对象
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
----------本文结束感谢您的阅读----------