目录
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文章来源:https://www.toymoban.com/news/detail-606236.html
将8080赋值给变量i文章来源地址https://www.toymoban.com/news/detail-606236.html
到了这里,关于单例模式的线程安全形式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!