单例模式?学习懒汉式和饿汉式
单例模式
1.单例模式的懒汉式实现package com.shine.study.designpatterns.singletonpatterns;
package com.shine.study.designpatterns.singletonpatterns; /** * @Author: Shine EtherealWind * @Description: 懒汉式 * 1.定义全局可见的对象引用; * 2.私有化的构造函数(每个类都有隐式的无参构造函数, * 这里显示写了私有构造函数也是制止其他类里面使用new的方式构造出这个类的对象); * 3.获取单例对象的方法,使用synchronized保证在并发情况下是线程安全的; * @Date: create in 17:10 2022/2/24 */ public class LazySingleton { // private static volatile LazySingleton instance = null; private LazySingleton(){ } public static LazySingleton getInstance() { if (instance == null){ synchronized (LazySingleton.class){ if (instance == null){ instance = new LazySingleton(); } } } return instance; } } class TestMain{ public static void main(String[] args) { LazySingleton lazySingleton1 = LazySingleton.getInstance(); LazySingleton lazySingleton2 = LazySingleton.getInstance(); /* * eqquals 方法表示两个对象的hashCode相同,且在同一个hashCode上的位置也相同; */ System.out.println("懒汉式单例两次获取的对象是否相同?"+ lazySingleton1.equals(lazySingleton2)); } }
运行结果
2.单例模式的饿汉式实现
package com.shine.study.designpatterns.singletonpatterns; import java.awt.*; /** * @Author: Shine EtherealWind * @Description: 饿汉式 * 1.定义对象的引用 instance 并且同时给定该单例引用的实例对象;(也可以将实例对象的写法改成静态代码块) * 2.私有化的构造函数(每个类都有隐式的无参构造函数, * 这里显示写了私有构造函数也是制止其他类里面使用new的方式构造出这个类的对象); * 3.获取单例对象的方法; * @Date: create in 17:15 2022/2/24 */ public class HungrySingleton { private static final HungrySingleton instance = new HungrySingleton(); private HungrySingleton(){} public static HungrySingleton getInstance(){ return instance; } } class TestMain2{ public static void main(String[] args) { HungrySingleton hungrySingleton1 = HungrySingleton.getInstance(); HungrySingleton hungrySingleton2 = HungrySingleton.getInstance(); //equals 方法表示两个对象的hashCode相同,且在同一个hashCode上的位置也相同 System.out.println("饿汉式单例两次获取的对象是否相同?"+ hungrySingleton1.equals(hungrySingleton2)); } }
运行结果