多線程新手村3--多線程代碼案例

1.1 單例模式

單例模式是設計模式中非常經典的一種。那么有同學肯定就會好奇了,什么是設計模式呢?

設計模式簡單的說就是程序員的“棋譜”,我們下象棋時肯定或多或少都背過棋譜,例如當頭炮、馬后炮等,設計模式也是這樣,開發過程中常常會遇到一些經典場景,用固定的解決方案去解決這些問題,這就是設計模式,今天我們先來介紹一下單例模式。

單例模式是指某個類只能實例化一個對象,不能有多個,這一點在很多場景中都會用到,例如數據庫中的DateSource實例就只需要一個;單例模式又有兩種實現方式,分別為餓漢模式和懶漢模式。

1.1.1 餓漢模式

在類加載的時候,創建實例(比較急切)

可以看到,由于將構造方法設為私有,所以當我們想要自己實例化一個對象的時候,編譯器會報錯,此時,這個類將只會有加載類時實例化的那一個對象,無法再實例化出其它對象。

1.1.2 懶漢模式

只有當需要的時候才創建實例

上述代碼可以看出,只有當首次調用getInstance方法時才會創建實例,否則將不會創建實例。

單線程中懶漢模式沒有問題,但是放在多線程中,就會存在許多bug!

1.1.3 懶漢模式(多線程版)

首先要解決一個疑惑,為什么餓漢模式的單線程都不會有bug,但是懶漢模式的多線程會存在bug呢?是因為餓漢模式的getInstance方法只有讀功能,但是懶漢模式的getInstance方法卻既可讀又可寫,兩個線程對于同一個變量進行寫操作,就很容易出現問題。所以我們要加鎖,將操作變為原子性的,這樣就不會出現問題了。

1、這里的加鎖是為了保證原子性操作,防止代碼出bug(new多個對象出來)

2、這里再一次判斷對象是否為空是為了確定要不要加鎖,因為如果不加這個代碼的話,每次調用這個方法都會加鎖,但是加鎖很費時,效率很低,不好!

3、此處的volatile關鍵字是為了防止出現指令重排序問題。

1.2 阻塞隊列

阻塞隊列是多線程代碼中常用的一種數據結構。

所謂阻塞隊列,其實就是加了阻塞功能的隊列。

a)如果隊列為空,繼續出隊列,就會發生阻塞,直到其它線程向隊列中加入元素。

b)如果隊列為滿,繼續入隊列,也會發生阻塞,直到其它線程向隊列中取走元素。

阻塞隊列,最大的意義是用來實現“生產者消費者模型”

“生產者消費者”模型的意義:

1、解耦合(單獨設置一個隊列,使原本兩個直接進行數據交互的元素通過這個隊列進行交互)

2、削峰填谷

當數據請求量很大的時候,如果沒有阻塞隊列的話,服務器A一直給服務器B發數據,就可能使服務器B崩潰;但是如果設置一個阻塞隊列,那么A只需要將數據放入隊列中,如果B此時已達到最大處理負荷的話,那B只需要慢慢的取出隊列中的數據處理即可;反之,如果此時數據請求量很小,那么服務器B就可以慢慢地消耗掉堆積在阻塞隊列中的數據。

1.3 阻塞隊列的代碼實現

以上代碼就是自己實現了一個簡易的阻塞隊列,可以用作一個簡單的“生產者消費者”模型。注意兩個wait和notify都是互相喚醒的,無法自己喚醒自己。

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

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

相關文章

接口性能測試復盤:解決JMeter超時問題的實踐

在優化接口并重新投入市場后,我們面臨著一項關鍵任務:確保其在高壓環境下穩定運行。于是,我們啟動了一輪針對該接口的性能壓力測試,利用JMeter工具模擬高負載場景。然而,在測試進行約一分鐘之后,頻繁出現了…

新人學習筆記之(函數2)

一、函數的參數 1.形參和實參 (1)在聲明函數時,可以在函數名稱后面的小括號中添加一些參數,這些參數被稱為形參,而在調用該函數時,同樣也需要傳遞相應的參數,這些參數被稱為實參 參數說明形參形…

【前端之npm鏡像地址】

npm鏡像地址 淘寶鏡像地址華為鏡像地址騰訊云鏡像地址 淘寶鏡像地址 npm config set registry https://registry.npmmirror.com查看鏡像設置: npm config get registry 華為鏡像地址 npm config set registry https://mirrors.huaweicloud.com/repository/npm/ 騰訊云鏡像地…

【機器學習】分值融合方法

舉例假設現有圖片的預測分數文本的預測分數。為了合理地融合圖片和文本的預測分數,可以采取多種方法,包括加權平均、直接相加或相乘等,但需要注意兩者是否在同一空間。以下是一些常見的方法和考慮因素: FROM GPT4 1. 確定預測分…

Mysql數據庫創建自增序列

創建序列表 CREATE TABLE sequence (name varchar(50) NOT NULL,current_value bigint(30) NOT NULL,increment int(11) NOT NULL DEFAULT 1 ) ENGINEInnoDB DEFAULT CHARSETutf8 ROW_FORMATDYNAMIC COMMENT序列表;創建函數 查詢當前序列名的序列值 CREATE DEFINERroot% FUNC…

Lambda表達式及Stream的使用

前言: 函數式編程是一種編程范式,它將計算過程視為函數應用的連續組合。函數式編程強調使用純函數(Pure Function),避免使用可變狀態和副作用,倡導將計算過程抽象為函數,便于代碼的理解、測試和…

Pytorch訓練LeNet模型MNIST數據集

如何用torch框架訓練深度學習模型(詳解) 0. 需要的包 import torch from torch.nn import CrossEntropyLoss from torch.optim import SGD from torch.utils.data import DataLoader from torchvision import datasets, transforms1. 數據加載和導入 …

Python圖形界面(GUI)Tkinter筆記(九):用【Button()】功能按鈕實現人機交互

在Tkinter庫中,功能按鈕(Button)是實現人機交互的一個非常重要的組件: 【一】主要可實現功能及意義: (1)響應用戶交互: Button組件允許用戶通過點擊來觸發某個事件或動作。當用戶點擊按鈕時,可以執行一個指定的函數或方法。 (2)提供用戶輸入: Button組件是圖形用戶界面(G…

持續總結中!2024年面試必問 20 道 Rocket MQ面試題(三)

上一篇地址:持續總結中!2024年面試必問 20 道 Rocket MQ面試題(二)-CSDN博客 五、什么是生產者(Producer)和消費者(Consumer)在RocketMQ中? RocketMQ是一個高性能、高吞…

Linux完整版命令大全(二十五)

pine 功能說明&#xff1a;收發電子郵件&#xff0c;瀏覽新聞組。語  法&#xff1a;pine [-ahikorz][-attach<附件>][-attach_and_delete<附件>][-attachlist<附件清單>][-c<郵件編號>][-conf][-create_lu<地址薄><排序法>][-f<收件…

劇本殺小程序開發,探索市場發展新的商業機遇

劇本殺游戲作為一個新興行業&#xff0c;經歷了爆發式的增長&#xff0c;劇本殺游戲在市場中的熱度不斷升高。 不過&#xff0c;在市場的火熱下&#xff0c;競爭也在逐漸加大。因此&#xff0c;在市場競爭下&#xff0c;成本低、主題多樣、有趣的線上劇本殺小程序成為了創業者…

竹云董事長在第二屆ICT技術發展與企業數字化轉型高峰論壇作主題演講

5月25日&#xff0c;由中國服務貿易協會指導&#xff0c;中國服務貿易協會信息技術服務委員會主辦的 “第二屆ICT技術發展與企業數字化轉型高峰論壇” 在北京隆重召開。 本次論壇以 “數據驅動&#xff0c;AI引領&#xff0c;打造新質生產力” 為主題&#xff0c;特邀業內200余…

WebGL實現醫學教學軟件

使用WebGL實現醫學教學軟件是一個復雜但非常有益的項目&#xff0c;可以顯著提升醫學教育的互動性和效果。以下是詳細的實現步驟&#xff0c;包括需求分析、技術選型、開發流程和注意事項。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#xff0c;歡迎交流合作…

redis-cli help使用

1. redis-cli命令使用—先連接上服務器 連接到 Redis 服務器&#xff1a; 使用 redis-cli 命令即可連接到本地運行的 Redis 服務器&#xff0c;默認連接到本地的 6379 端口。 redis-cli如果 Redis 服務器不在本地或者端口不同&#xff0c;可以使用 -h 和 -p 參數指定主機和端…

華為校招機試 - LRU模擬(20240515)

題目描述 LRU(Least Recently Used)緩存算法是一種常用于管理緩存的策略,其目標是保留最近使用過的數據,而淘汰最久未被使用的數據。 實現簡單的LRU緩存算法,支持查詢、插入、刪除操作。 最久未被使用定義:查詢、插入和刪除操作均為一次訪問操作,每個元素均有一個最后…

探索Django 5: 從零開始,打造你的第一個Web應用

今天我們將一起探索 Django 5&#xff0c;一個備受開發者喜愛的 Python Web 框架。我們會了解 Django 5 的簡介&#xff0c;新特性&#xff0c;如何安裝 Django&#xff0c;以及用 Django 編寫一個簡單的 “Hello, World” 網站。最后&#xff0c;我會推薦一本與 Django 5 相關…

蘇洵,大器晚成的家風塑造者

&#x1f4a1; 如果想閱讀最新的文章&#xff0c;或者有技術問題需要交流和溝通&#xff0c;可搜索并關注微信公眾號“希望睿智”。 蘇洵&#xff0c;字明允&#xff0c;號老泉&#xff0c;生于宋真宗大中祥符二年&#xff08;公元1009年&#xff09;&#xff0c;卒于宋英宗治平…

量產導入 | 產品可靠性測試標準完整大集合(JEDEC/IEC/SAE…)

產品可靠性測試標準完整大集合(JEDEC/IEC/SAE…) 產品可靠性測試是產品質量保證中的重要一環, 包含有Pre-con, aging(壽命)和ESD(靜電)等, 下面就收集了權威標準JEDEC全系列, 請參照如下 同時也附上其它的可靠性標準供大家參考及交叉理解, 可能側重點不同, 大家可以參…

go語言同一包中的同一變量實現不同平臺設置不同的默認值 //go:build 編譯語法使用示例

在使用go來開發跨平臺應用的時候&#xff0c;比如配置文件的路徑&#xff0c;我們希望設置一個默認值&#xff0c;windows下的路徑是類似 d:\myapp\app.conf 這樣的&#xff0c; unix系統中的路徑是 /opt/myapp/app.conf 這樣的&#xff0c; 而我們在使用的時候需要使用的是同…

PPT忘記保存?教你如何輕松恢復

在日常辦公中PPT文件作為主流文檔格式&#xff0c;承載著我們大量的工作成果。然而當不小心誤點了“不保存”按鈕&#xff0c;或是遭遇軟件崩潰等意外情況導致文檔丟失時&#xff0c;文件內容是否還能夠能恢復&#xff0c;往往成為我們最關心的問題。本文將為您提供五大免費且實…