中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

重慶模板網(wǎng)站多少錢(qián)烘焙甜點(diǎn)培訓(xùn)學(xué)校

重慶模板網(wǎng)站多少錢(qián),烘焙甜點(diǎn)培訓(xùn)學(xué)校,WordPress管理圖片,今天北京疫情最新情況一、線程安全的單例模式 什么是單例模式 單例模式是一種“經(jīng)典的,常用的,??嫉摹痹O(shè)計(jì)模式 什么是設(shè)計(jì)模式 IT行業(yè)這么火,涌入的人很多.俗話說(shuō)林子大了啥鳥(niǎo)都有。大佬和菜雞們兩極分化的越來(lái)越嚴(yán)重,為了讓菜雞們不太拖大佬的后…

一、線程安全的單例模式

什么是單例模式

單例模式是一種“經(jīng)典的,常用的,??嫉摹?strong>設(shè)計(jì)模式

什么是設(shè)計(jì)模式

IT行業(yè)這么火,涌入的人很多.俗話說(shuō)林子大了啥鳥(niǎo)都有。大佬和菜雞們兩極分化的越來(lái)越嚴(yán)重,為了讓菜雞們不太拖大佬的后腿,于是大佬們針對(duì)一些經(jīng)典的常見(jiàn)的場(chǎng)景,給定了一些對(duì)應(yīng)的解決方案,這個(gè)就是 設(shè)計(jì)模式

單例模式的特點(diǎn)

某些類(lèi),只應(yīng)該具有一個(gè)對(duì)象(實(shí)例),就稱(chēng)之為單例

例如一個(gè)男人只能有一個(gè)媳婦

在很多服務(wù)器開(kāi)發(fā)場(chǎng)景中,經(jīng)常需要讓服務(wù)器加載很多的數(shù)據(jù)(上百G)到內(nèi)存中,此時(shí)往往要用一個(gè)單例的類(lèi)來(lái)管理這些數(shù)據(jù)

餓漢實(shí)現(xiàn)方式和懶漢實(shí)現(xiàn)方式

【洗碗的例子】

吃完飯,立刻洗碗,這種就是餓漢方式.因?yàn)橄乱活D吃的時(shí)候可以立刻拿著碗就能
吃完飯,先把碗放下,然后下一頓飯用到這個(gè)碗了再洗碗,就是懶漢方式?

懶漢方式最核心的思想是“延時(shí)加載”,從而能夠優(yōu)化服務(wù)器的啟動(dòng)速度

餓漢方式實(shí)現(xiàn)單例模式

懶漢方式實(shí)現(xiàn)單例模式

存在一個(gè)嚴(yán)重的問(wèn)題,線程不安全

第一次調(diào)用 GetInstance的時(shí)候,如果兩個(gè)線程同時(shí)調(diào)用,可能會(huì)創(chuàng)建出兩份T對(duì)象的實(shí)例

但是后續(xù)再次調(diào)用,就沒(méi)有問(wèn)題了

懶漢方式實(shí)現(xiàn)單例模式(線程安全版本)

// 懶漢模式, 線程安全
template <typename T>
class Singleton {volatile static T* inst; // 需要設(shè)置 volatile 關(guān)鍵字, 否則可能被編譯器優(yōu)化.static std::mutex lock;
public:static T* GetInstance() {if (inst == NULL) { // 雙重判定空指針, 降低鎖沖突的概率, 提高性能.lock.lock(); // 使用互斥鎖, 保證多線程情況下也只調(diào)用一次 new.if (inst == NULL) {inst = new T();}lock.unlock();
}return inst;}
};

注意事項(xiàng):

  1. 加鎖解鎖的位置

  2. 雙重 if 判定, 避免不必要的鎖競(jìng)爭(zhēng)

  3. volatile關(guān)鍵字防止過(guò)度優(yōu)化

二、STL,智能指針和線程安全

STL 中的容器是否是線程安全的?

不是. 原因是,STL的設(shè)計(jì)初衷是將性能挖掘到極致,而一旦涉及到加鎖保證線程安全,會(huì)對(duì)性能造成巨大的影響. 而且對(duì)于不同的容器,加鎖方式的不同,性能可能也不同(例如hash 表的鎖表和鎖桶).因此 STL 默認(rèn)不是線程安全.如果需要在多線程環(huán)境下使用,往往需要調(diào)用者自行保證線程安全.

智能指針是否是線程安全的?

對(duì)于 unique_ptr,由于只是在當(dāng)前代碼塊范圍內(nèi)生效,因此不涉及線程安全問(wèn)題.

對(duì)于 shared_ptr,多個(gè)對(duì)象需要共用一個(gè)引用計(jì)數(shù)變量,所以會(huì)存在線程安全問(wèn)題.但是標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)的時(shí)候考慮到了這個(gè)問(wèn)題,基于原子操作(CAS)的方式保證 shared_ptr 能夠高效,原子的操作引用計(jì)數(shù).

★ps:智能指針不等于智能指針對(duì)象,所以在應(yīng)用中該加鎖加鎖

三、可重入 VS 線程安全

概念

  • 線程安全

多個(gè)線程并發(fā)同一段代碼時(shí),不會(huì)出現(xiàn)不同的結(jié)果。常見(jiàn)對(duì)全局變量或者靜態(tài)變量進(jìn)行操作,并且沒(méi)有鎖保護(hù)的情況下,會(huì)出現(xiàn)該問(wèn)題

  • 重入

同一個(gè)函數(shù)被不同的執(zhí)行流調(diào)用,當(dāng)前一個(gè)流程還沒(méi)有執(zhí)行完,就有其它的執(zhí)行流再次進(jìn)入,我們稱(chēng)之為重入。一個(gè)函數(shù)在重入的情況下,運(yùn)行結(jié)果不會(huì)出現(xiàn)任何不同或者任何問(wèn)題,則該函數(shù)被稱(chēng)為可重入函數(shù),否則,是不可重入函數(shù)

★ps:可重入不可重入函數(shù)表示能不能被多個(gè)執(zhí)行流同時(shí)進(jìn)入

★ps:線程安全表示多線程并發(fā)執(zhí)行一段代碼會(huì)不會(huì)出錯(cuò)

常見(jiàn)的線程不安全的情況

? 不保護(hù)共享變量的函數(shù)

? 函數(shù)狀態(tài)隨著被調(diào)用,狀態(tài)發(fā)生變化的函數(shù)

? 返回指向靜態(tài)變量指針的函數(shù)

? 調(diào)用線程不安全函數(shù)的函數(shù)

常見(jiàn)的線程安全的情況

? 每個(gè)線程對(duì)全局變量或者靜態(tài)變量只有讀取的權(quán)限,而沒(méi)有寫(xiě)入的權(quán)限,一般來(lái)說(shuō)這些線程是安全的

? 類(lèi)或者接口對(duì)于線程來(lái)說(shuō)都是原子操作

? 多個(gè)線程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性

常見(jiàn)不可重入的情況

? 調(diào)用了 malloc/free 函數(shù),因?yàn)?malloc 函數(shù)是用全局鏈表來(lái)管理堆的

? 調(diào)用了標(biāo)準(zhǔn)I/O庫(kù)函數(shù),標(biāo)準(zhǔn)I/O庫(kù)的很多實(shí)現(xiàn)都以不可重入的方式使用全局?jǐn)?shù)據(jù)結(jié)構(gòu)

? 可重入函數(shù)體內(nèi)使用了靜態(tài)的數(shù)據(jù)結(jié)構(gòu)

常見(jiàn)可重入的情況

? 不使用全局變量或者靜態(tài)變量

? 不使用malloc 或者 new 開(kāi)辟出的空間

? 不調(diào)用不可重入函數(shù)

? 不返回靜態(tài)或全局?jǐn)?shù)據(jù),所有數(shù)據(jù)都有函數(shù)的調(diào)用者提供

? 使用本地?cái)?shù)據(jù),或者通過(guò)制作全局?jǐn)?shù)據(jù)的本地拷貝來(lái)保護(hù)全局?jǐn)?shù)據(jù)

可重入與線程安全聯(lián)系

? 函數(shù)是可重入的,那線程就是安全的

? 函數(shù)是不可重入的,那就不能由多個(gè)線程使用,有可能引發(fā)線程安全問(wèn)題

? 如果一個(gè)函數(shù)中有全局變量,那么這個(gè)函數(shù)既不是線程安全也不是可重入的

可重入與線程安全的區(qū)別

? 可重入函數(shù)是線程安全函數(shù)的一種

? 線程安全不一定是可重入的,而可重入函數(shù)則一定是安全的

? 如果將對(duì)臨界資源的訪問(wèn)加上鎖,則這個(gè)函數(shù)是線程安全的,但如果這個(gè)重入函數(shù)若鎖還未釋放則會(huì)產(chǎn)生死鎖,因此是不可重入的

四、死鎖

概念

死鎖是指在一組進(jìn)程中的各個(gè)進(jìn)程均占有不會(huì)釋放的資源,但因互相申請(qǐng)被其他進(jìn)程所站用 不會(huì)釋放的資源而處于的一種永久等待狀態(tài)。

死鎖的四個(gè)必要條件

? 互斥條件:一個(gè)資源每次只能被一個(gè)執(zhí)行流使用 ? 請(qǐng)求與保持條件:一個(gè)執(zhí)行流因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放 ? 不剝奪條件:一個(gè)執(zhí)行流已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪 ? 循環(huán)等待條件:若干執(zhí)行流之間形成一種頭尾相接的循環(huán)等待資源的關(guān)系

避免死鎖

? 破壞死鎖的四個(gè)必要條件

? 加鎖順序一致

? 避免鎖未釋放的場(chǎng)景

? 資源一次性分配

避免死鎖的算法

死鎖檢測(cè)算法

銀行家算法

http://www.risenshineclean.com/news/44677.html

相關(guān)文章:

  • 制作網(wǎng)站程序黑帽seo培訓(xùn)大神
  • 手機(jī)在線銷(xiāo)售網(wǎng)站 - 百度百度人工客服電話怎么轉(zhuǎn)人工
  • 學(xué)習(xí)做網(wǎng)站的網(wǎng)站愛(ài)站關(guān)鍵詞挖掘工具
  • 網(wǎng)游網(wǎng)站開(kāi)發(fā)如何做好搜索引擎優(yōu)化工作
  • 關(guān)注建設(shè)銀行網(wǎng)站如何讓網(wǎng)站被百度收錄
  • 貴陽(yáng)建設(shè)網(wǎng)站公司5118
  • 做帶會(huì)員后臺(tái)的網(wǎng)站用什么軟件阿里指數(shù)官方網(wǎng)站
  • 醫(yī)療圖片做網(wǎng)站圖片鎮(zhèn)江網(wǎng)絡(luò)
  • 沈陽(yáng)順天建設(shè)集團(tuán)網(wǎng)站成都seo經(jīng)理
  • 微信平臺(tái)制作網(wǎng)站開(kāi)發(fā)站長(zhǎng)之家怎么用
  • 做阿里巴巴網(wǎng)站免費(fèi)的網(wǎng)站域名查詢(xún)
  • 品牌宣傳網(wǎng)站建設(shè)網(wǎng)站賣(mài)鏈接
  • 百度云免費(fèi)空間seo主要做什么工作
  • 肇東網(wǎng)站建設(shè)知了seo
  • 怎么做網(wǎng)站的輪播圖荊門(mén)今日頭條新聞發(fā)布
  • 中國(guó)做的比較好的網(wǎng)站網(wǎng)站提交收錄軟件
  • 網(wǎng)站開(kāi)發(fā) 哪個(gè)工具更快seo網(wǎng)站關(guān)鍵詞排名軟件
  • cms做企業(yè)網(wǎng)站6長(zhǎng)沙網(wǎng)站seo方法
  • 石家莊網(wǎng)站建設(shè)案例數(shù)據(jù)指數(shù)
  • 外國(guó)人做的漢字網(wǎng)站關(guān)鍵詞搜索排名查詢(xún)
  • 網(wǎng)站建設(shè)電子書(shū)dw網(wǎng)頁(yè)制作教程
  • 學(xué)校網(wǎng)站建設(shè)項(xiàng)目管理報(bào)告買(mǎi)外鏈
  • 寧波方正建設(shè)監(jiān)理網(wǎng)站seo助理
  • 做服務(wù)的網(wǎng)站html網(wǎng)頁(yè)制作模板代碼
  • 中國(guó)建設(shè)銀行官網(wǎng)站保本理財(cái)培訓(xùn)機(jī)構(gòu)咨詢(xún)
  • 導(dǎo)航網(wǎng)站怎么建福建百度seo排名點(diǎn)擊軟件
  • 佛山網(wǎng)站推廣 優(yōu)幫云線上銷(xiāo)售渠道有哪幾種
  • 自己怎么做網(wǎng)站的聚合頁(yè)面百度推廣怎么收費(fèi)的
  • 電氣網(wǎng)站模板免費(fèi)推廣的網(wǎng)站有哪些
  • 購(gòu)買(mǎi)網(wǎng)站服務(wù)器培訓(xùn)機(jī)構(gòu)招生方案