Spring的IOC容器(容器中所有的实例bean唯一的)饿汉式单例模式 仍然可以根据反射破坏
package com.igeek.javase.pattern.singleton;
/**
@version 1.0
@Description 设计模式之一 - 单例模式 - 饿汉式单例
@Author chenmin
@Date 2021/4/23 11:05
*
单例模式:整个应用中只存在唯一的实例
使用场景:业务场景(ATM银行实例是单例模式)、Spring的IOC容器(容器中所有的实例bean唯一的)等等
*
1.饿汉式单例
2.懒汉式单例
*
线程安全
3.静态内部类的单例
4.线程安全的单例
*/
public class SingletonDemo1 {
//私有的静态的本类的实例
private static SingletonDemo1 instance = new SingletonDemo1();
//私有化的构造器
private SingletonDemo1(){
}
//公开的静态的获得本类实例的方法
public static SingletonDemo1 getInstance(){
return instance;
}
}
懒汉式单例
package com.igeek.javase.pattern.singleton;
/**
@version 1.0
@Description 设计模式之一 - 单例模式 - 懒汉式单例
@Author chenmin
@Date 2021/4/23 11:05
*
单例模式:整个应用中只存在唯一的实例
使用场景:业务场景(ATM银行实例是单例模式)、Spring的IOC容器(容器中所有的实例bean唯一的)等等
*
1.饿汉式单例
2.懒汉式单例(用户多)
*
线程安全
3.静态内部类的单例
4.线程安全的单例
*/
public class SingletonDemo2 {
//私有的静态的本类的实例
private static SingletonDemo2 instance;
//私有化的构造器
private SingletonDemo2(){
System.out.println(Thread.currentThread().getName());
}
//公开的静态的获得本类实例的方法
public static SingletonDemo2 getInstance(){
if(instance == null){
instance = new SingletonDemo2();
}
return instance;
}
}
线程安全单例
package com.igeek.javase.pattern.singleton;
/**
@version 1.0
@Description 设计模式之一 - 单例模式 - 线程安全的单例
@Author chenmin
@Date 2021/4/23 11:05
*
单例模式:整个应用中只存在唯一的实例
使用场景:业务场景(ATM银行实例是单例模式)、Spring的IOC容器(容器中所有的实例bean唯一的)等等
*
1.饿汉式单例
2.懒汉式单例(用户多)
*
线程安全
3.静态内部类的单例
4.线程安全的单例
*/
public class SingletonDemo3 {
//私有的静态的本类的实例
private static volatile SingletonDemo3 instance;
//私有化的构造器
private SingletonDemo3(){
System.out.println(Thread.currentThread().getName());
}
// 公开的静态的获得本类实nchr例的方法
// 不能保证所有操作的原子性 - 加syonized锁
**// 提高效率 - DCL double checked lock 双重检查锁**
public static /*synchronized*/ SingletonDemo3 getInstance(){
if(instance==null){
//对象锁 SingletonDemo3.class
synchronized(SingletonDemo3.class){
if(instance == null){
instance = new SingletonDemo3();
/**
* instance = new SingletonDemo3(); 可能会发生指令重排
* 1.创建引用instance
* 2.开辟内存,存储对象
* 3.将引用指向对象
*
* 期望:123
* 可能会发生:132... 直接将实例指向对象,但是对象未实例化
*
* **解决方案:禁止指令重排,加'内存屏障',volatile**
*
*** 并发访问:可见性、原子性、重排性**
*
** * volatile支持可见性、禁止重排性
synchronized 支持原子性*
*/
}
}
}
return instance;
}
}
静态内部类的单例
package com.igeek.javase.pattern.singleton;
/**
@version 1.0
@Description 设计模式之一 - 单例模式 - 静态内部类的单例
@Author chenmin
@Date 2021/4/23 11:05
*
单例模式:整个应用中只存在唯一的实例
使用场景:业务场景(ATM银行实例是单例模式)、Spring的IOC容器(容器中所有的实例bean唯一的)等等
*
1.饿汉式单例
2.懒汉式单例(用户多)
*
线程安全
3.静态内部类的单例
4.线程安全的单例
*/
public class SingletonDemo4 {
//私有化的构造器
private SingletonDemo4(){
System.out.println(Thread.currentThread().getName());
}
//静态的内部类提供唯一实例
static class SingleInnerClass{
//私有的静态的本类的实例
private static SingletonDemo4 instance = new SingletonDemo4();
}
//公开的静态的获得本类实例的方法
public static SingletonDemo4 getInstance(){
return SingleInnerClass.instance;
}
}