右鍵+清除本來好好的按一個(gè)N就可以,現(xiàn)在整的啥?清除個(gè)內(nèi)容還要按3個(gè)鍵?
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
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
奇妙之處
兩個(gè)緩沖區(qū)各自處理,互不干擾
兩個(gè)緩沖區(qū)很好的解決了應(yīng)用程序的“快速、多線程”與IO操作的“緩慢,單線程”的矛盾。應(yīng)該說,引入雙緩沖區(qū)是一個(gè)顯而易見的方式。
緩沖區(qū)交換
通過交換指針的方式實(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)容。