AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

再使用System.out.println()打印收拾東西回家

來源: 責編: 時間:2023-10-10 18:31:13 268觀看
導讀一、前言今天沒事干的時候,無意間點到了一個System.out.println()中的println()方法,一個閃亮的關鍵字沖擊著我的眼睛。不知道大家知不知道,那就是加鎖的synchronized。但凡有鎖的地方肯定會性能是有損耗的,當然得在并發

iXR28資訊網——每日最新資訊28at.com

一、前言

今天沒事干的時候,無意間點到了一個System.out.println()中的println()方法,一個閃亮的關鍵字沖擊著我的眼睛。iXR28資訊網——每日最新資訊28at.com

不知道大家知不知道,那就是加鎖的synchronized。但凡有鎖的地方肯定會性能是有損耗的,當然得在并發的情況下!iXR28資訊網——每日最新資訊28at.com

synchronized在JDK8還是6之后進入了鎖升級概念:無鎖--->偏向鎖--->自旋鎖--->輕量級鎖--->重量級鎖iXR28資訊網——每日最新資訊28at.com

「輕量級鎖和偏向鎖通常不涉及內核態切換」iXR28資訊網——每日最新資訊28at.com

「在到重量級鎖時涉及到用戶態和內核態的切換,很影響性能的!」iXR28資訊網——每日最新資訊28at.com

有興趣的可以自己研究一下synchronized的鎖升級和降級!iXR28資訊網——每日最新資訊28at.com

下面我們回歸正題,看一下這個System.out.println()!iXR28資訊網——每日最新資訊28at.com

二、源碼和分析

網上文章很多,大家想看System和out的詳細解讀,可以去看看哈,這里主要看一下println()這個方法的源碼!iXR28資訊網——每日最新資訊28at.com

public void println(Object x) {    String s = String.valueOf(x);    synchronized (this) {        print(s);        newLine();    }}

我們以傳進來的是Object對象為例,其他類型比這個少了一個轉化為String在輸出!iXR28資訊網——每日最新資訊28at.com

這種方式通常被稱為對象級別的鎖,因為它是以對象為粒度進行同步的!iXR28資訊網——每日最新資訊28at.com

print(s);newLine();這兩個操作在同一時間只被一個線程執行,以防止輸出的內容被多個線程交織在一起,導致輸出混亂。iXR28資訊網——每日最新資訊28at.com

這種同步是為了保證輸出的可見性和一致性。當然也帶來了性能的損耗,一般情況不會引起線程阻塞,當多個線程嘗試同時訪問同一個控制臺輸出時,由于控制臺輸出的同步性質,可能會導致線程競爭鎖,從而導致程序響應慢!iXR28資訊網——每日最新資訊28at.com

當然在沒有并發的場景中,使用一下也沒什么,切記不要在輸出里面加上大量的運算和轉換邏輯。iXR28資訊網——每日最新資訊28at.com

「但是為了不給后期埋雷,咱們還是盡量不要使用。」iXR28資訊網——每日最新資訊28at.com

「可以使用專門的日志框架,如Log4j、Logback等,它們提供了更靈活的日志記錄和輸出控制。」iXR28資訊網——每日最新資訊28at.com

我們在查看一下:newLine()iXR28資訊網——每日最新資訊28at.com

我們會發現它也是一個加鎖的方法!iXR28資訊網——每日最新資訊28at.com

private void newLine() {    try {        synchronized (this) {            ensureOpen();            textOut.newLine();            textOut.flushBuffer();            charOut.flushBuffer();            if (autoFlush)                out.flush();        }    }    catch (InterruptedIOException x) {        Thread.currentThread().interrupt();    }    catch (IOException x) {        trouble = true;    }}

里面的textOut.flushBuffer()也是有鎖的!iXR28資訊網——每日最新資訊28at.com

void flushBuffer() throws IOException {    synchronized (lock) {        ensureOpen();        if (nextChar == 0)            return;        out.write(cb, 0, nextChar);        nextChar = 0;    }}

我們在看一下ensureOpen()方法,然后一直點就會發現 write(String chars, int start, int count)也是加著鎖的!iXR28資訊網——每日最新資訊28at.com

所以我們還是不要輕易在項目中使用哈,「咱們還是使用日志框架」,還能有不用的日志級別打印,多香!iXR28資訊網——每日最新資訊28at.com

每天一個小技巧哈!iXR28資訊網——每日最新資訊28at.com

public void write(String str, int off, int len) throws IOException {    synchronized (lock) {        char cbuf[];        if (len <= WRITE_BUFFER_SIZE) {            if (writeBuffer == null) {                writeBuffer = new char[WRITE_BUFFER_SIZE];            }            cbuf = writeBuffer;        } else {    // Don't permanently allocate very large buffers.            cbuf = new char[len];        }        str.getChars(off, (off + len), cbuf, 0);        write(cbuf, 0, len);    }}

三、缺點和方案

1、缺點

性能問題

使用 System.out.println() 輸出信息到控制臺通常比內存操作和計算操作慢得多。這是因為控制臺輸出涉及到文件I/O操作,需要將數據寫入控制臺。在高性能的應用程序中,頻繁的輸出會導致程序的性能下降,特別是在大規模數據處理和高并發情況下。iXR28資訊網——每日最新資訊28at.com

缺乏日志級別

System.out.println() 不支持不同的日志級別(如DEBUG、INFO、ERROR等),因此無法將輸出信息分類為不同的重要性。在生產環境中,通常需要能夠根據日志級別過濾和記錄信息。iXR28資訊網——每日最新資訊28at.com

無法集中管理日志

System.out.println() 輸出的信息通常散落在代碼的各個地方,不容易集中管理。在實際應用中,通常需要將日志集中存儲和管理,以便日后的監控、分析和故障排查。iXR28資訊網——每日最新資訊28at.com

2、方案

我們上面也是說了,這里在強調一遍哈:iXR28資訊網——每日最新資訊28at.com

建議使用專門的日志框架來管理和控制日志輸出,一些流行的 Java 日志框架包括:Log4j、Logback、SLF4J...iXR28資訊網——每日最新資訊28at.com

四、總結

雖然 System.out.println() 在快速測試和學習階段很有用,但在實際的應用程序中,頻繁使用它可能會導致一系列問題。iXR28資訊網——每日最新資訊28at.com

因此,建議在生產環境中使用專門的日志框架來管理和控制日志輸出,以便更好地滿足應用程序的需求,并提高代碼的可維護性和可擴展性。iXR28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-12711-0.html再使用System.out.println()打印收拾東西回家

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 我們一起聊聊C#堆排序算法

下一篇: 使用 ClickHouse 做日志分析

標簽:
  • 熱門焦點
  • 一加Ace2 Pro真機揭曉 鈦空灰配色質感拉滿

    終于,在經過了幾波預熱之后,一加Ace2 Pro的外觀真機圖在網上出現了。還是博主數碼閑聊站曝光的,這次的外觀設計還是延續了一加11的方案,只是細節上有了調整,例如新加入了鈦空灰
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 8月總票房已突破10億!《封神》第一:口碑已經成了

    8月5日消息,據燈塔專業版數據,截至8月5日9時35分,8月總票房(含預售)已突破10億。其中,《封神》以大比分的優勢領先。根據官方消息,目前該片總票房已經超過14.
  • 騰訊VS網易,最卷游戲暑期檔,誰能笑到最后?

    作者:無銹缽來源:財經無忌7月16日晚,上海1862時尚藝術中心。伴隨著幻象的精準命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰隊以絕對的優勢戰勝了BLG戰隊,拿下了總決
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己&ldquo;當家&rdquo;的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • iQOO 11S新品發布會

    iQOO將在7月4日19:00舉行新品發布會,推出杭州亞運會電競賽事官方用機iQOO 11S。
  • 7月4日見!iQOO 11S官宣:“雞血版”驍龍8 Gen2+200W快充加持

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
Top