单例模式与多线程

如何使单例模式遇到多线程是安全的、正确的。

立即加载/“饿汗模式”

什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接new实例化。而立即加载从中文的语境来看,有“着急”、”急迫”的含义,所以也称为“饿汉模式”。
立即加载/“饿汉模式”是在调用方法前,实例已经被创建了。
代码清单1 饿汉模式

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
public class MyObject {
//立即加载方式==饿汉模式
private static MyObject myObject=new MyObject();
private MyObject(){
}
public static MyObject getInstance(){
//此版本代码为立即加载
//此版本代码的缺点是不能有其他实例变量
//因为getInstance()方法没有同步
//所以有可能出现非线性安全问题
return myObject;
}
}
public class MyThread extends Thread {
@Override
public void run() {
System.out.println(MyObject.getInstance().hashCode());
}
}
public class Run {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
MyThread t3= new MyThread();
t1.start();
t2.start();
t3.start();
}
}

运行结果如图1所示,打印的hashCode是同一个值,说明对象是同一个,也就实现了立即加载型单例设计模式。



图1 “饿汉模式”的运行结果

延迟加载/“懒汉模式”

什么是延迟加载?延迟加载就是字啊调用get()方法时实例才被创建,常见的实现方法就是在get()方法中进行new实例化。而延迟加载从中文的语境来看,是“缓慢”、“不急迫”的含义,所以也称为“懒汉模式”。

Java多线程编程核心技术源代码

Adhere to the original technology to share, your support will encourage me to continue to create!