单例模式
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));
}
}
运行结果