单例模式的线程安全形式

目录

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

你可能感兴趣的:(单例模式)