單例模式---餓漢式、懶漢式

一、什么是單例模式

單例模式,指的是一個類中的對象只能有一個,它在內存中只會創建一次對象的設計模式

二、餓漢式

public class SingleTon {// 私有的構造方法private SingleTon() {};// 1. 餓漢式private static SingleTon instance = new SingleTon(); // 一開始就初始化好// 線程是安全的,// 因為這個實例是一開始就創建好的,無論幾個線程來調,他只是讀這個instance變量,不存在寫public static SingleTon getInstance() {  // 對外提供獲取這個實例的方法return instance;}
}

餓漢式的問題是:?一開始就實例化對象,如果實例化過程非常耗時,并且最后這個對象若沒有被使用,白白造成資源浪費?

?

三、懶漢式

public class SingleTonL {private SingleTonL() {};private static SingleTonL instance1 = null;// 2.懶漢式  線程是不安全的public static SingleTonL getInstance() {if  (instance1 == null) {instance1 = new SingleTonL();  // 這里面是一個寫入的動作}return instance1;}
}

對于懶漢式這一設計模式,線程是不安全的,針對這個問題,給出了解決方案

方案:使用? synchronized? 關鍵字

??假如有多個線程中都調用了getInstance方法,那么都走到 if (instance== null) 判斷時,可能同時成立,因為instance初始化時默認值是null。這樣會導致多個線程中同時創建instance對象,即instance對象被創建了多次,違背了只創建一個instance對象的初衷

// 解決上述線程不安全的問題
public class SingleTonL1 {private SingleTonL1() {};private static SingleTonL1 instance1 = null;// 2.懶漢式  線程是不安全的public static  SingleTonL1 getInstance() {synchronized (SingleTonL1.class) {if  (instance1 == null) {instance1 = new SingleTonL1();  // 這里面是一個寫入的動作}}return instance1;}
}

還有一個問題就是如果instance != null , 按照上述代碼,這個線程也會進入鎖,,,影響執行的效率。需要在前面在進行是否為空判斷

// 解決上述線程不安全的問題
class SingleTonL1 {private SingleTonL1() {};private static SingleTonL1 instance1 = null;// 2.懶漢式  線程是不安全的public static  SingleTonL1 getInstance() {if (instance1 == null) {  // 先判斷,如果不為null, 則不用加鎖,直接返回synchronized (SingleTonL1.class) {if  (instance1 == null) {instance1 = new SingleTonL1();  // 這里面是一個寫入的動作}}}return instance1;}
}

?

多線程下的內存可見性

?當A線程更改了變量instance后,線程B又訪問,此時需要讓線程B訪問到的是變量instance的被更改后的值。(也就是說線程B去取這個變量的時候必須從主存取,不能從緩存取。)

解決方案: volatile

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208560.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208560.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

整數以及浮點數在內存中的存儲

一.整數在內存當中的存儲 數據在內存中是以十六進制補碼的形式進行存儲的。 原碼表示法簡單易懂,適用于乘法,但用原碼表示的數進行加減運算比較復雜,當兩數相加時,如果同號則數值相加,但是進行減法時要先比較絕對值的…

認知覺醒(六)

認知覺醒(六) 第二節 感性:頂級的成長竟然是“憑感覺” 人類生存于世,比拼的是腦力思維,但極少有人知道,我們的身體里還有一個更高級的系統,若能善用,成就非凡。 1941年,德軍對英國本土進行…

Neo4j介紹

1、Neo4j介紹 Neo4j 是一個圖數據庫管理系統,它專注于存儲和處理圖形結構的數據。圖數據庫是一類特殊的數據庫,用于有效地管理圖形數據模型,其中數據以節點、關系和屬性的形式存儲。 2、Neo4j特點 圖數據庫: Neo4j 是一種 NoSQ…

目標檢測器技術演進簡史

引言 目標檢測算法的發展已經取得了長足的進步,從早期的計算機視覺方法開始,通過深度學習達到了很高的準確度。在這篇博文中,我們將一起回顧一下這些算法的發展階段以及現代目標檢測系統中使用的主要方法。 我們首先回顧早期傳統的目標檢測…

大數據技術3:數據倉庫的ETL和分層模型

前言:我們先了解一下數據倉庫架構的演變過程。 1 、數據倉庫定義 數據倉庫是一個面向主題的(Subject Oriented)、集成的(Integrate)、相對穩定的(Non-Volatile)、反映歷史變化(Time…

電商系統架構演進

聊聊電商系統架構演進 具體以電子商務網站為例, 展示web應用的架構演變過程。 1.0時代 這個時候是一個web項目里包含了所有的模塊,一個數據庫里包含了所需要的所有表,這時候網站訪問量增加時,首先遇到瓶頸的是應用服務器連接數&a…

深入體驗:山海鯨可視化軟件的獨特魅力

山海鯨可視化軟件是一款功能強大的數據可視化工具,作為該軟件的資深用戶,我深感其獨特的魅力和優勢。下面,我將從軟件特點、操作體驗、數據交互和實際應用場景等方面,為大家詳細介紹山海鯨可視化軟件。 首先,山海鯨可視…

解決Eslint和Prettier關于三元運算符的沖突問題

三元運算符Prettier的格式化 三元運算符Eslint的格式要求 解決辦法 // eslint加入配置,屏蔽標紅報錯indent: [error, 2, { ignoredNodes: [ConditionalExpression] }]效果

Nginx按指定格式記錄訪問日志

今天突然想起來一個日志的一個東西,因為拉項目無意中看到了日志文件的一些東西,現在不經常做后端了,加上其他的一些原因吧.有時候有些問題也沒想太多,馬馬虎虎就過了,后來想想還是要記錄一下這方面的處理過程吧: 一般我們作為開發人員關注的日志只是在應用程序層面的,我們稱它…

LSTM_預測價格問題_keras_代碼實操

0、問題描述 使用Bicton數據集,對close數據進行預測,使用60個數據點預測第61個數據點。 下載數據集:Bitcoin Historical Data 前期已經使用了MLP和RNN進行預測:這里 1、 沒有寫完,明天再寫:)…

POJ 3735 Training little cats 動態規劃(矩陣的冪)

一、題目大意 我們有N只貓&#xff0c;每次循環進行K次操作&#xff08;N<100&#xff0c;K<100&#xff09;&#xff0c;每次操作可有以下三種選擇&#xff1a; 1、g i 給第i只貓1個食物 2、e i 讓第i只貓吃完它所有的食物 3、s i j 交換第i和j只貓的食物。 求出M次…

JS自己定義數組擴展方法 求和 和 最大值、最小值

相信有小伙伴看到這一個標題可能會想&#xff1a;現在都可以自己寫方法了嗎&#xff1f;這么炸裂。沒錯我們是可以自己寫方法的。 1.我們定義的這個方法&#xff0c;任何一個數組實例對象都可以使用 2.自定義的方法寫到 數組.propertype身上 最大值 const arr [1,2,3,4]Array…

銷售技巧培訓之如何提高手機銷售技巧

銷售技巧培訓之如何提高手機銷售技巧 隨著科技的迅速發展&#xff0c;手機已成為我們日常生活中不可或缺的一部分。作為一名手機銷售員&#xff0c;了解手機銷售技巧是必不可少的。本文將通過案例分析與實踐&#xff0c;為你揭示手機銷售的奧秘。 一、了解客戶需求 在銷售過程…

AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 3 “編譯 NXP i.MX RT1060”( 完 )

此章節敘述如何修改、建構 i.MX RT1060 的 Sample Code“aws_remote_control_wifi_nxp” 1. 點擊“Import SDK example(s)” 2. 選擇“MIMXRT1062xxxxA”>“evkmimxrt1060”&#xff0c;并確認 SDK 版本后&#xff0c;點擊“Next>” 3. 選擇“aws_examples”>“aw…

在 Docker 容器中運行 macOS:接近本機性能,實現高效運行 | 開源日報 No.96

cxli233/FriendsDontLetFriends Stars: 2.6k License: MIT 這個項目是關于數據可視化中好的和不好的實踐&#xff0c;作者通過一系列例子解釋了哪些圖表類型是不合適的&#xff0c;并提供了如何改進或替代它們。主要功能包括展示錯誤做法以及正確做法&#xff0c;并提供相應代…

【數值計算方法(黃明游)】解線性代數方程組的迭代法(一):向量、矩陣范數與譜半徑【理論到程序】

文章目錄 一、向量、矩陣范數與譜半徑1、向量范數a. 定義及性質補充解釋范數差 b. 常見的向量范數 l 1 l_1 l1?、 l 2 l_2 l2?、 l ∞ l_\infty l∞? 范數性質關系 2、矩陣范數a. 矩陣的范數b. 常見的矩陣范數相容范數算子范數 3、譜半徑4、知識點總結1. 向量范數2. 矩陣范數…

Mybatis XML 多表查詢

這篇需結合 <<Mybatis XML 配置文件>>那一篇博客一起看 工作中盡量避免使用多表查詢,尤其是對性能要求非常高的項目 我們之前建了個用戶表(代碼在Mybatis XML配置文件那篇博客里),這次再建一個文章表,代碼如下 : -- 創建?章表 DROP TABLE IF EXISTS articleinf…

vue中組件傳值方法

父組件給子組件傳值 一、 1.在子組件標簽中寫入父組件傳遞數據 向下傳遞prop 2.在子組件內聲明props選項接收父組件傳遞的數據 props:[,,] 父組件&#xff1a; <Header :msgmsg ></Header> 子組件&#xff1a; props:[msg], 二、 provide i…

vue 批量下載文件,不走后端接口的方法

今天ld提了一個需求&#xff0c;說頁面的列表里面有要下載的地址,然后點擊批量下載。我思索片刻&#xff0c;給出了代碼 1.這個是列表頁面的代碼 <!-- 這個是列表頁面的代碼 --> <el-table :data"userListShow" align"center"border highlight-…

AI 訓練框架:Pytorch TensorFLow MXNet Caffe ONNX PaddlePaddle

https://medium.com/jit-team/bridge-tools-for-machine-learning-frameworks-3eb68d6c6558