考试通知

多线程 4

多线程 4 1. 单例模式单例模式是一种设计模式。它的核心思想是一个类在整个应用程序中只创建一个实例并提供一个统一的访问接口设计模式 应对常见问题的解决方案。假设女朋友经常生气但每次用 道歉 买礼物 就能很快和女朋友和好“道歉 买礼物” 在某种意义上就是设计模式。单例模式就是应对程序反复出现的问题的解决方案单例模式最常见的 2 种实现方式 1. 懒汉模式 2. 饿汉模式2. 饿汉模式在类加载的时候创建实例classSingleton{privatestaticSingletoninstancenewSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returninstance;}}3. 懒汉模式在使用的时候创建实例classSingletonLazy{privatestaticSingletonLazyinstancenull;publicstaticSingletonLazygetInstance(){//把实例的创建时机推迟到 第一次使用的时候if(instancenull){instancenewSingletonLazy();}returninstance;}privateSingletonLazy(){}}多线程懒汉模式饿汉模式不涉及到修改操作return instance 是读操作多线程去读同一个变量没有线程安全问题java 的赋值虽然是原子的前提是符合instance null只有符合条件才能赋值所以需要把条件判断和赋值操作看作一个整体。在多线程的情况下如果有 2 个线程同时getInstance获取实例那就有可能在线程1条件判断后操作系统去调度线程2线程2创建实例1 完成后再次调度回线程1那么线程1就会重复创建实例 ——实例2虽然线程2创建的实例2由于没有被引用被回收了, 但这仍然是线程安全问题懒汉模式的线程不安全只是在创建实例之前创建好实例之后都是读操作不会存在线程安全问题解决方式就是把这 2 个操作打包成一个整体也就是加锁 publicstaticSingletonLazygetInstance(){synchronized(locker){if(instancenull){instancenewSingletonLazy();}}returninstance;}这样有一个线程加锁即使是去调度其他线程其他线程会进入堵塞状态实例就不会被多次创建。这样线程安全问题就解决了。但是每次调用getInstance()都会加锁不管这个实例是不是创建了。懒汉模式只是在实例创建前存在线程安全问题这样不必要的加锁就会导致其他线程堵塞影响效率解决方式是在加锁前进行判断是否要加锁 publicstaticSingletonLazygetInstance(){//判断是否要加锁if(instancenull){synchronized(locker){if(instancenull){instancenewSingletonLazy();}}}returninstance;}如果实例已经创建好了那就不需要加锁如果没创建好实例那就需要加锁保证线程安全不必要的加锁就不存在了。但是instance new SingletonLazy();可能存在指令重排序的情况的在创建实例的时候可以分成 3 个步骤分配内存空间针对空间进行初始化把内存空间的地址赋值给引用变量但是由于指令重排序1 2 3 可能会变成 1 3 2 很可能后面的代码会使用未初始化的成员属性对代码逻辑产生影响。那么应该使用 volatile 关键字禁止指令重排序privatevolatilestaticSingletonLazyinstancenull;
← 返回资讯列表 预约报考咨询 →
NEXT STEP

看完公告,下一步怎么走?

把报考交给靠谱的人:材料预审、批次抢报、考前辅导、复审提醒,全程有人跟。

进入报考专题