参考:https://blog.csdn.net/weixin_48052161/article/details/108261179
单例设计模式概念
单例模式可以说是大多数开发人员在实际中使用最多的,常见的Spring默认创建的bean就是单例模式的。
单例模式有很多好处,比如可节约系统内存空间,控制资源的使用。
其中单例模式最重要的是确保对象只有一个。
简单来说,保证一个类在内存中的对象就一个。
饿汉式:
类加载到内存后,就实例化一个单例,JVM保证线程安全
简单实用,推荐使用!
唯一缺点:不管用到与否,类装载时就完成实例化
一开始就实例化:
package com.example.dtest.design23.singleton.hunger;
public class Mgr01 {
private static final Mgr01 INSTANCE = new Mgr01();
private Mgr01(){};
public static Mgr01 getInstance(){
return INSTANCE;
}
public void m(){
System.out.println("m");
}
}
package com.example.dtest.design23.singleton.hunger;
public class HungerSingletonTest {
public static void main(String[] args) {
Mgr01 m1 = Mgr01.getInstance();
Mgr01 m2= Mgr01.getInstance();
System.out.println(m1 == m2);
}
}
懒汉式 :
使用的时候再实例化:
package com.example.dtest.design23.singleton.lazy;
/**
* lazy loading
* 也称懒汉式
* 虽然达到了按需初始化的目的,但却带来线程不安全的问题
* 可以通过synchronized解决,但也带来效率下降
*/
public class Mgr06 {
private static volatile Mgr06 INSTANCE;//JIT
private Mgr06(){
}
public static Mgr06 getInstance(){
if(INSTANCE == null){
// 双重检测
synchronized (Mgr06.class){
if(INSTANCE == null){
INSTANCE = new Mgr06();
}
}
}
return INSTANCE;
}
public void m(){
System.out.println("m");
}
}
package com.example.dtest.design23.singleton.lazy;
public class LazyTest {
public static void main(String[] args) {
for(int i=0;i<100;i++){
new Thread(()->{
System.out.println(Mgr06.getInstance().hashCode());
}).start();
}
}
}
枚举型:
枚举类实现单例模式是 effective java 作者极力推荐的单例实现模式,因为枚举类型是线程安全的,并且只会装载一次,设计者充分的利用了枚举的这个特性来实现单例模式,
枚举的写法非常简单,而且枚举类型是所用单例实现中唯一一种不会被破坏的单例实现模式。
package com.example.dtest.design23.singleton.lazy.lazyEnum;
public enum Mgr08 {
INSTANCE;
public void m(){
}
public static void main(String[] args) {
for(int i=0;i<100;i++){
new Thread(()->{
System.out.println(Mgr08.INSTANCE.hashCode());
}).start();
}
}
}