单例设计模式
单例设计模式
懒汉式
/*
* 单例设计模式:懒汉式
* */
public class SingleTonDemo02 {
public static void main(String[] args) {
Demo02 instance1 = Demo02.getInstance();
Demo02 instance2 = Demo02.getInstance();
System.out.println(instance1 == instance2);
}
}
class Demo02 {
// 1.私有化类的构造器
private Demo02() {
}
// 2.在内部静态声明,没初始化
private static Demo02 instance = null;
// 声明一个公共静态的返回这个实例对象的方法
public static Demo02 getInstance() {
// 判断是否实例化过,没有就实例化
if (instance == null) {
// 实例赋值
instance = new Demo02();
}
return instance;
}
}
饿汉式
package com.designMode.singleTon;
/*
* 单例设计模式:饿汉式
* */
public class SingleTonDemo01 {
public static void main(String[] args) {
// 可以拿到
Demo01 instance = Demo01.getInstance();
// 无论第几次都是同一个,只有一个实例
Demo01 instance1 = Demo01.getInstance();
// 为true
System.out.println(instance == instance1);
}
}
// 饿汉式
class Demo01 {
// 1.私有化类的构造器
private Demo01() {
}
// 2.内部静态创建类的对象
private static Demo01 instance = new Demo01();
// 3.提供公共的静态方法
public static Demo01 getInstance() {
return instance;
}
}
区别
饿汉式:
- 坏处:开始就创建对象,生命周期过长,节约时间
- 好处:线程安全
懒汉式:
- 好处:延迟对象的创建,节约内存
- 坏处:目前写法不安全
线程安全的懒汉式
原来的写法
有概率会是线程不安全,创建两个对象
public class SingleTonDemo02 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask futureTask1 = new FutureTask(() -> Demo02.getInstance());
FutureTask futureTask2 = new FutureTask(() -> Demo02.getInstance());
new Thread(futureTask1).start();
new Thread(futureTask2).start();
Object instance1 = futureTask1.get();
Object instance2 = futureTask2.get();
// 有概率会是false
System.out.println(instance1 == instance2);
}
}
class Demo02 {
// 1.私有化类的构造器
private Demo02() {
}
// 2.在内部静态声明,没初始化
private static Demo02 instance = null;
// 声明一个公共静态的返回这个实例对象的方法
public static Demo02 getInstance() {
// 判断是否实例化过
if (instance == null) {
// 实例赋值
instance = new Demo02();
}
return instance;
}
}
线程安全写法
public synchronized static Demo02 getInstance() {
// 判断是否实例化过
if (instance == null) {
// 实例赋值
instance = new Demo02();
}
return instance;
}
此时为线程安全