GOF23设计模式(一)

GOF设计模式之单例模式(一)

单例模式:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

单例模式之饿汉式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 单例模式:饿汉式
* 直接在初始化类的时候把对象new出来,如果不用对象就会浪费空间。
* 线程安全,调用效率高,不需要同步锁。
*/
public class Singleton1 {
private static Singleton1 instance=new Singleton1();
private Singleton1() {
}
public static Singleton1 getInstance() {
return instance;
}
public static void main(String[] args) {
System.out.println(Singleton1.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
/**
* 单例模式:懒汉式
* 多线程调用模式下需要在对象上加上volatile,避免指令重排导致对象多次new。
* 线程安全,调用效率不高,需要同步锁,不浪费资源,使用时在new对象。
* 这个写法改进了懒汉式与双重检查锁结合。
* volatile:每当子线程某一语句要用到volatile变量时,
* 都会从主线程重新拷贝一份,这样就保证子线程的会跟主线程的一致。
*/
public class Singleton2 {
//多线程模式下加上volatile
private static volatile Singleton2 instance;
private Singleton2() {
}
public static Singleton2 getInstance() {
if(instance==null) {
//double checking 提高效率。
synchronized(Singleton2.class){
if(instance==null) {
instance=new Singleton2();
}
}
}
return instance;
}
public static void main(String[] args) {
new Thread(()->{
System.out.println(Singleton2.getInstance());
}).start() ;
}
}

单例模式之双重检查锁式

不推荐使用,在使用时由于编译器优化原因和JVM底层内部模型原因,偶尔会出问题,指令重排,在JDK1.5后加入volatile可以解决此问题,详见本博客的懒汉式写法。

原创技术分享,您的支持将鼓励我继续创作
0%