一、前言
如何使单例模式遇到多线程是安全的、正确的?
我们在学习设计模式的时候知道单例模式有懒汉式和饿汉式之分。简单来说,饿汉式就是在使用类的时候已经将对象创建完毕,懒汉式就是在真正调用的时候进行实例化操作。
二、饿汉式+多线程
public class MyObject {
//饿汉模式
private static MyObject myObject=new MyObject();
private MyObject(){
}
public static MyObject 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();
}
}
程序运行后的结果如下所示:
hashCode是同一个值,说明对象是同一个。也就是说饿汉式单例模式在多线程环境下是线程安全的。
三、懒汉式+多线程
public class MyObject {
private static MyObject myObject;
/*私有构造函数避免被实例化*/
private MyObject(){
}
public static MyObject getInstance(){
try {
if (myObject==null)