目录
1.单例设计模式的概念
2.实现方法:
1.饿汉式
2.懒汉式
3.区分饿汉式和懒汉式:
3.单例模式的双重校验线程安全形式
1.线程安全问题的解决方法
1.1 synchronized关键字:
1.2 volatile关键字:
保证变量可见性(不保证原子性)
禁止指令的重排序
2.线程安全的单例模式的代码实现
PS.什么是指令的重排序
1.单例设计模式的概念
单例:只能存在一个对象实例
设计模式:大量实践中总结和理论化后优选的代码结构编码风格。就像是一些固定套路
2.实现方法:
1.饿汉式
1.私有化类的构造器
2.内部创建类的私有静态对象
3.提供类的对象的静态get方法
#饿汉式
public class singleTonHungry {//1.私有化类的构造器private singleTonHungry(){}//2.内部创建类的对象private static singleTonHungry singleTonHungry = new singleTonHungry();//3.提供静态方法返回private static singleTonHungry getSingleTonHungry(){return singleTonHungry;}}
2.懒汉式
1.私有化类的构造器
2.声明当前类的对象:null
3.声明一个public、static的方法返回当前类对象的方法
#懒汉式
public class singleTonLazy {//1.私有化类的构造器private singleTonLazy(){}//2.创建对象私有化private static singleTonLazy singleTonInstance;//3.静态方法返回public static singleTonLazy getInstance(){if (null == singleTonInstance){singleTonInstance = new singleTonLazy();}return singleTonInstance;}}
3.区分饿汉式和懒汉式:
1.懒汉式:好处:延迟对象创建
坏处:线程不安全,到多线程内容时,再修改。
2.饿汉式: 好处:是线程安全的
坏处:对象在内存中加载时间过长
3.单例模式的双重校验线程安全形式
1.线程安全问题的解决方法
1.1 synchronized关键字:
synchronized译为:使同步
synchronized(同步监视器){需要被同步代码}
同步监视器,俗称锁;任何类的对象都可以充当锁;
1.2 volatile关键字:
volatile译为:不稳定的
保证变量可见性(不保证原子性)
使用volatile修饰的变量,是共享且不稳定的,使用时从主存中读取改变量
禁止指令的重排序
在对volatile修饰的变量进行读写操作时,能够防止JVM指令重排序
2.线程安全的单例模式的代码实现
public class singleTon{private singleTon(){}//为实例加上volatile关键字private volatile static singleTon singleTonInstance;public static singleTon getSingleTonInstance(){if(null == singleTonInstance){//加上synchronize锁synchronized(singleTon.class){singleTonInstance = new singleTon();}}return singleTonInstance; }
}
PS.什么是指令的重排序
2.1 指令
计算机执行操作的命令,比如算术运算指令、程序流程控制指令、处理器控制指令
2.2 重排序
CPU为了最大性能利用率,只要能够保证程序最终结果和顺序化执行下结果相等,就可以更改指令执行顺序
指令的排序与代码的关系,比如:
int i = 8080;
这行代码需要执行两条指令:
加载常量8080
将8080赋值给变量i