电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

java面試常見模式問題---單例模式

瀏覽:72日期:2022-08-11 08:43:06
目錄1、簡介2、單例模式——懶漢式3、單例模式——餓漢式總結1、簡介

單例模式使⽤場景

業務系統全局只需要⼀個對象實例,⽐如發號器、 redis 連接對象等。 Spring IOC容器中的 Bean 默認就是單例。 Spring Boot 中的 Controller、Service、Dao 層中通過 @Autowire的依賴注⼊對象默認都是單例的。

單例模式分類

懶漢:就是所謂的懶加載,延遲創建對象,需要用的時候再創建對象。 餓漢:與懶漢相反,提前創建對象。 單例模式實現步驟: 私有化構造函數提供獲取單例的方法。2、單例模式——懶漢式單例模式——懶漢式有以下⼏種實現⽅式:

/** * @Auther: csp1999 * @Date: 2020/11/06/20:36 * @Description: 單例設計模式-懶漢式 */public class SingletonLazy { // 當需要用到該實例的時候再創建實例對象 private static SingletonLazy instance; /** * 構造函數私有化 * 不能通過 new SingletonLazy() 的方式創建實例 * * 當需要用到該實例的時候在加載 * 只能通過 SingletonLazy.getInstance() 這種方式獲取實例 */ private SingletonLazy() { } /** * 單例對象的方法 */ public void process() {System.out.println('方法實例化成功!'); } /** * 方式一: * <p> * 對外暴露一個方法獲取該類的對象 * <p> * 缺點:線程不安全,多線程下存在安全問題 * * @return */ public static SingletonLazy getInstance() {if (instance == null) {// 實例為null時候才創建 /** * 線程安全問題: * 當某一時刻,兩個或多個線程同時判斷到instance == null成立的時候 * 這些線程同時進入該if判斷內部執行實例化 * 則會新建出不止一個SingletonLazy實例 */ instance = new SingletonLazy();// 當需要的時候再進行實例化對象}return instance; } /** * 方式二: * 通過加synchronized鎖 保證線程安全 * * 采用synchronized 對方法加鎖有很大的性能開銷 * 因為當getInstance2()內部邏輯比較復雜的時候,在高并發條件下 * 沒獲取到加鎖方法執行權的線程,都得等到這個方法內的復雜邏輯執行完后才能執行,等待浪費時間,效率比較低 * * @return */ public static synchronized SingletonLazy getInstance2() {if (instance == null) {// 實例為null時候才創建 // 方法上加synchronized鎖后可以保證線程安全 instance = new SingletonLazy();// 當需要的時候再進行實例化對象}return instance; } /** * 方式三: * 在getInstance3()方法內,針對局部需要加鎖的代碼塊加鎖,而不是給整個方法加鎖 * * 也存在缺陷: * @return */ public static SingletonLazy getInstance3() {if (instance == null) {// 實例為null時候才創建 // 局部加鎖后可以保證線程安全,效率較高 // 缺陷:假設線程A和線程B synchronized (SingletonLazy.class){// 當線程A獲得鎖的執行權的時候B等待 A執行new SingletonLazy();實例化// 當A線程執行完畢后,B再獲得執行權,這時候還是可以實例化該對象instance = new SingletonLazy();// 當需要的時候再進行實例化對象 }}return instance; }}單例模式:懶漢實現 + 雙重檢查鎖定 + 內存模型

對于上面方式三存在的缺陷,我們可以使用雙重檢查鎖定的方式對其進行改進

/** * 方式三改進版本: * 在getInstance3()方法內,針對局部需要加鎖的代碼塊加鎖,而不是給整個方法加鎖 * * DCL 雙重檢查鎖定 (Double-Checked-Locking) 在多線程情況下保持高性能 * * 這是否安全? instance = new SingletonLazy(); 并不是原子性操作 * jvm中 instance實例化內存模型流程如下: * 1.分配空間給對象 * 2.在空間內創建對象 * 3.將對象賦值給instance引用 * * 假如出現如下順序錯亂的情況: * 線程的執行順序為:1 -> 3 -> 2, 那么這時候會把值寫回主內存 * 則,其他線程就會讀取到instance的最新值,但是這個是不完全的對象 * (指令重排現象) * * @return */public static SingletonLazy getInstance3plus() { if (instance == null) {// 實例為null時候才創建// 局部加鎖后可以保證線程安全,效率較高// 假設線程A和線程B synchronized (SingletonLazy.class){// 第一重檢查 // 當線程A獲得鎖的執行權的時候B等待 A執行new SingletonLazy();實例化 // 當A線程執行完畢后,B再獲得執行權,這時候再判斷instance == null是否成立 // 如果不成立,B線程無法 實例化SingletonLazy if (instance == null){// 第二重檢查instance = new SingletonLazy();// 當需要的時候再進行實例化對象 }} } return instance;}

再次升級方式三,來解決內存模型中的指令重排問題

// 添加volatile 關鍵字,禁止實例化對象時,內存模型中出現指令重排現象private static volatile SingletonLazy instance;/** * 方式三再次升級版本: * 在getInstance3()方法內,針對局部需要加鎖的代碼塊加鎖,而不是給整個方法加鎖 * * DCL 雙重檢查鎖定 (Double-Checked-Locking) 在多線程情況下保持高性能 * * 解決指令重排問題——禁止指令重排 * @return */public static SingletonLazy getInstance3plusplus() { if (instance == null) {// 實例為null時候才創建// 局部加鎖后可以保證線程安全,效率較高// 假設線程A和線程Bsynchronized (SingletonLazy.class){// 第一重檢查 // 當線程A獲得鎖的執行權的時候B等待 A執行new SingletonLazy();實例化 // 當A線程執行完畢后,B再獲得執行權,這時候再判斷instance == null是否成立 // 如果不成立,B線程無法 實例化SingletonLazy if (instance == null){// 第二重檢查instance = new SingletonLazy();// 當需要的時候再進行實例化對象 }} } return instance;}

單例模式——懶漢式調用:

@Testpublic void testSingletonLazy(){ SingletonLazy.getInstance().process();}3、單例模式——餓漢式

/** * @Auther: csp1999 * @Date: 2020/11/06/21:39 * @Description: 單例設計模式-餓漢式 */public class SingletonHungry { // 當類加載的時候就直接實例化對象 private static SingletonHungry instance = new SingletonHungry(); private SingletonHungry(){} /** * 單例對象的方法 */ public void process() {System.out.println('方法實例化成功!'); } public static SingletonHungry getInstance(){return instance;// 當類加載的時候就直接實例化對象 }}單例模式——餓漢式調用:

@Testpublic void testSingletonHungry(){ SingletonHungry.getInstance().process();}

餓漢式單例模式,當類加載的時候就直接實例化對象,因此不需要考慮線程安全問題。

優點:實現簡單,不需要考慮線程安全問題。 缺點:不管有沒有使用該對象實例,instance對象一直占用著這段內存。

懶漢與餓漢式如何選擇?

如果對象內存占用不大,且創建不復雜,直接使用餓漢的方式即可。 其他情況均采用懶漢方式(優選)。總結

文章會不定時更新,有時候一天多更新幾篇,如果幫助您復習鞏固了知識點,還請支持一下,后續會億點點的更新!希望大家多多關注好吧啦網的其他內容!

標簽: Java
相關文章:
主站蜘蛛池模板: SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | CNC机加工-数控加工-精密零件加工-ISO认证厂家-鑫创盟 | 实验室隔膜泵-无油防腐蚀隔膜泵-耐腐蚀隔膜真空泵-杭州景程仪器 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 干洗店加盟_洗衣店加盟_干洗店设备-伊蔻干洗「武汉总部」 | RS系列电阻器,RK_RJ启动调整电阻器,RQ_RZ电阻器-上海永上电器有限公司 | 新能源汽车教学设备厂家报价[汽车教学设备运营18年]-恒信教具 | 压接机|高精度压接机|手动压接机|昆明可耐特科技有限公司[官网] 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 泰国试管婴儿_泰国第三代试管婴儿费用|成功率|医院—新生代海外医疗 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 双齿辊破碎机-大型狼牙破碎机视频-对辊破碎机价格/型号图片-金联机械设备生产厂家 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 微量水分测定仪_厂家_卡尔费休微量水分测定仪-淄博库仑 | 耐火砖厂家,异形耐火砖-山东瑞耐耐火材料厂| FFU_空气初效|中效|高效过滤器_空调过滤网-广州梓净净化设备有限公司 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 挤奶设备过滤纸,牛奶过滤纸,挤奶机过滤袋-济南蓝贝尔工贸有限公司 | 北京网络营销推广_百度SEO搜索引擎优化公司_网站排名优化_谷歌SEO - 北京卓立海创信息技术有限公司 | 真空包装机-诸城市坤泰食品机械有限公司 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 雾度仪_雾度计_透光率雾度仪价格-三恩时(3nh)光电雾度仪厂家 | 绿叶|绿叶投资|健康产业_绿叶投资集团有限公司 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 昆明网络公司|云南网络公司|昆明网站建设公司|昆明网页设计|云南网站制作|新媒体运营公司|APP开发|小程序研发|尽在昆明奥远科技有限公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 车牌识别道闸_停车场收费系统_人脸识别考勤机_速通门闸机_充电桩厂家_中全清茂官网 | 阿尔法-MDR2000无转子硫化仪-STM566 SATRA拉力试验机-青岛阿尔法仪器有限公司 | 污泥烘干机-低温干化机-工业污泥烘干设备厂家-焦作市真节能环保设备科技有限公司 | 南京泽朗生物科技有限公司-液体饮料代加工_果汁饮料代加工_固体饮料代加工 | 茅茅虫AI论文写作助手-免费AIGC论文查重_写毕业论文降重 | 冷水机-工业冷水机-冷水机组-欧科隆品牌保障 | 五轴加工中心_数控加工中心_铝型材加工中心-罗威斯 | 美甲贴片-指甲贴片-穿戴美甲-假指甲厂家--薇丝黛拉 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 世纪豪门官网 世纪豪门集成吊顶加盟电话 世纪豪门售后电话 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | 流水线电子称-钰恒-上下限报警电子秤-上海宿衡实业有限公司 | 深圳市宏康仪器科技有限公司-模拟高空低压试验箱-高温防爆试验箱-温控短路试验箱【官网】 | 粤丰硕水性环氧地坪漆-防静电自流平厂家-环保地坪涂料代理 |