奇妙的雙緩沖機(jī)制寫日志(Java實(shí)現(xiàn))

      網(wǎng)友投稿 1075 2025-04-01

      寫日志面臨的問題

      寫日志在Web程序中是一個(gè)十分基礎(chǔ)與常見的需求,其對(duì)性能的要求很高。主要需要處理以下問題

      多線程并發(fā),需要保證順序性。

      高配IO操作,但I(xiàn)O操作相比其他指令耗時(shí)長(zhǎng),性能低。

      即一方面需要面對(duì)程序端高配的日志寫請(qǐng)求,一方面需要受限于系統(tǒng)磁盤相對(duì)緩慢寫入文件,應(yīng)該如何處理呢。

      雙緩沖區(qū)

      因此,引入雙緩沖區(qū)機(jī)制,一個(gè)緩沖區(qū)存儲(chǔ)應(yīng)用程序端發(fā)送的日志,按照時(shí)間順序依次存儲(chǔ);另一個(gè)緩沖區(qū)負(fù)責(zé)向低層磁盤發(fā)送寫文件請(qǐng)求。

      寫文件請(qǐng)求執(zhí)行相對(duì)較慢,因此當(dāng)寫文件執(zhí)行完畢后,通知管理程序,此時(shí)可以將另一個(gè)緩沖區(qū)內(nèi)容寫入磁盤了。

      雙緩沖區(qū)的奇妙之處就在于,兩個(gè)緩沖區(qū)的交換,是通過交換指針來實(shí)現(xiàn)的,非常的高效。

      部分實(shí)現(xiàn)代碼如下(其他部分邏輯代碼已省略)。

      // 負(fù)責(zé)接收應(yīng)用程序發(fā)來的日志 LinkedList currentBuffer = new LinkedList<>(); // 負(fù)責(zé)將數(shù)據(jù)同步到磁盤 LinkedList syncBuffer = new LinkedList<>();

      public void log(String content) { // 加鎖保證第一個(gè)緩沖區(qū) synchronized(this) { // 將log寫入內(nèi)存緩沖中,這里不會(huì)直接刷入磁盤文件 currentBuffer.add(content); } // 將緩沖區(qū)中的內(nèi)容刷到磁盤 logSync(); }

      private void logSync() { synchronized(this) { // 當(dāng)前在刷內(nèi)存緩沖到磁盤中去 if (isSyncRunning) { // 判斷是否第二個(gè)緩沖區(qū)還在刷 while (isSyncRunning) { try { // 釋放鎖,即允許第一個(gè)緩沖區(qū)繼續(xù)接收日志緩存, 然后等待被喚醒 wait(2000); } catch (Exception e) { e.printStackTrace(); } } // 此時(shí)沒有人在寫磁盤 } // 交換緩沖區(qū)指針 setReadyToSync(); // 設(shè)置當(dāng)前正在同步到磁盤的標(biāo)志位 isSyncRunning = true; } // 刷磁盤,性能最低,不能加鎖 logBuffer.flush(); synchronized(this) { // 同步完磁盤之后,將標(biāo)志位復(fù)位 isSyncRunning = false; // 喚醒其他等待刷磁盤的線程 notifyAll(); } }

      public void setReadyToSync() { LinkedList tmp = currentBuffer; currentBuffer = syncBuffer; syncBuffer = tmp; }

      奇妙之處

      兩個(gè)緩沖區(qū)各自處理,互不干擾

      兩個(gè)緩沖區(qū)很好的解決了應(yīng)用程序的“快速、多線程”與IO操作的“緩慢,單線程”的矛盾。應(yīng)該說,引入雙緩沖區(qū)是一個(gè)顯而易見的方式。

      緩沖區(qū)交換

      奇妙的雙緩沖機(jī)制寫日志(Java實(shí)現(xiàn))

      通過交換指針的方式實(shí)現(xiàn)兩個(gè)緩沖區(qū)的功能互換,十分巧妙,令人稱贊。

      總結(jié)

      你知道嗎?電視機(jī)里也在用著雙緩沖機(jī)制

      任務(wù)調(diào)度 多線程

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:實(shí)現(xiàn)文件夾加密后別人無法找到自已的重要excel文件的方法(excel文件加密,別人只能打開不能更改)
      下一篇:Excel2016表格怎么以副本方式打開文件(excel怎么設(shè)置副本)
      相關(guān)文章
      亚洲天天在线日亚洲洲精| 亚洲无人区午夜福利码高清完整版| 亚洲精品无码MV在线观看| 色婷婷六月亚洲综合香蕉| 亚洲熟妇AV日韩熟妇在线| 亚洲国产日韩综合久久精品| 亚洲国产视频一区| 亚洲男女性高爱潮网站| 亚洲男人天堂影院| 亚洲第一永久在线观看| 亚洲va久久久噜噜噜久久狠狠| 亚洲中文字幕无码久久精品1| 久久精品亚洲男人的天堂| 亚洲人成网站色在线入口| 亚洲国产精品尤物YW在线观看| 日韩亚洲翔田千里在线| 亚洲国产欧美国产综合一区| 亚洲成a人无码亚洲成www牛牛| 亚洲av无码专区在线电影天堂| 亚洲av永久中文无码精品| 国产AV无码专区亚洲AV蜜芽| 色婷婷亚洲一区二区三区| 一本色道久久88亚洲综合 | 亚洲午夜精品久久久久久app| 亚洲免费视频网址| 国产精品高清视亚洲精品| 亚洲中文字幕无码av| 亚洲变态另类一区二区三区| 在线观看亚洲视频| 亚洲日韩VA无码中文字幕| 亚洲色婷婷一区二区三区| 亚洲精品无码AV人在线播放| 亚洲大片在线观看| 亚洲日本在线观看网址| 亚洲精品天堂在线观看| 亚洲精品无码日韩国产不卡av| 国内成人精品亚洲日本语音| 亚洲色欲久久久久综合网| 国产亚洲3p无码一区二区| 亚洲午夜精品久久久久久人妖| 亚洲精品不卡视频|