日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

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

來(lái)源: 責(zé)編: 時(shí)間:2023-10-10 18:31:13 244觀看
導(dǎo)讀一、前言今天沒(méi)事干的時(shí)候,無(wú)意間點(diǎn)到了一個(gè)System.out.println()中的println()方法,一個(gè)閃亮的關(guān)鍵字沖擊著我的眼睛。不知道大家知不知道,那就是加鎖的synchronized。但凡有鎖的地方肯定會(huì)性能是有損耗的,當(dāng)然得在并發(fā)

YAd28資訊網(wǎng)——每日最新資訊28at.com

一、前言

今天沒(méi)事干的時(shí)候,無(wú)意間點(diǎn)到了一個(gè)System.out.println()中的println()方法,一個(gè)閃亮的關(guān)鍵字沖擊著我的眼睛。YAd28資訊網(wǎng)——每日最新資訊28at.com

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

synchronized在JDK8還是6之后進(jìn)入了鎖升級(jí)概念:無(wú)鎖--->偏向鎖--->自旋鎖--->輕量級(jí)鎖--->重量級(jí)鎖YAd28資訊網(wǎng)——每日最新資訊28at.com

「輕量級(jí)鎖和偏向鎖通常不涉及內(nèi)核態(tài)切換」YAd28資訊網(wǎng)——每日最新資訊28at.com

「在到重量級(jí)鎖時(shí)涉及到用戶態(tài)和內(nèi)核態(tài)的切換,很影響性能的!」YAd28資訊網(wǎng)——每日最新資訊28at.com

有興趣的可以自己研究一下synchronized的鎖升級(jí)和降級(jí)!YAd28資訊網(wǎng)——每日最新資訊28at.com

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

二、源碼和分析

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

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

我們以傳進(jìn)來(lái)的是Object對(duì)象為例,其他類型比這個(gè)少了一個(gè)轉(zhuǎn)化為String在輸出!YAd28資訊網(wǎng)——每日最新資訊28at.com

這種方式通常被稱為對(duì)象級(jí)別的鎖,因?yàn)樗且詫?duì)象為粒度進(jìn)行同步的!YAd28資訊網(wǎng)——每日最新資訊28at.com

print(s);newLine();這兩個(gè)操作在同一時(shí)間只被一個(gè)線程執(zhí)行,以防止輸出的內(nèi)容被多個(gè)線程交織在一起,導(dǎo)致輸出混亂。YAd28資訊網(wǎng)——每日最新資訊28at.com

這種同步是為了保證輸出的可見(jiàn)性和一致性。當(dāng)然也帶來(lái)了性能的損耗,一般情況不會(huì)引起線程阻塞,當(dāng)多個(gè)線程嘗試同時(shí)訪問(wèn)同一個(gè)控制臺(tái)輸出時(shí),由于控制臺(tái)輸出的同步性質(zhì),可能會(huì)導(dǎo)致線程競(jìng)爭(zhēng)鎖,從而導(dǎo)致程序響應(yīng)慢!YAd28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然在沒(méi)有并發(fā)的場(chǎng)景中,使用一下也沒(méi)什么,切記不要在輸出里面加上大量的運(yùn)算和轉(zhuǎn)換邏輯。YAd28資訊網(wǎng)——每日最新資訊28at.com

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

「可以使用專門(mén)的日志框架,如Log4j、Logback等,它們提供了更靈活的日志記錄和輸出控制?!?span style="display:none">YAd28資訊網(wǎng)——每日最新資訊28at.com

我們?cè)诓榭匆幌拢簄ewLine()YAd28資訊網(wǎng)——每日最新資訊28at.com

我們會(huì)發(fā)現(xiàn)它也是一個(gè)加鎖的方法!YAd28資訊網(wǎng)——每日最新資訊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()也是有鎖的!YAd28資訊網(wǎng)——每日最新資訊28at.com

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

我們?cè)诳匆幌耬nsureOpen()方法,然后一直點(diǎn)就會(huì)發(fā)現(xiàn) write(String chars, int start, int count)也是加著鎖的!YAd28資訊網(wǎng)——每日最新資訊28at.com

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

每天一個(gè)小技巧哈!YAd28資訊網(wǎng)——每日最新資訊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);    }}

三、缺點(diǎn)和方案

1、缺點(diǎn)

性能問(wèn)題

使用 System.out.println() 輸出信息到控制臺(tái)通常比內(nèi)存操作和計(jì)算操作慢得多。這是因?yàn)榭刂婆_(tái)輸出涉及到文件I/O操作,需要將數(shù)據(jù)寫(xiě)入控制臺(tái)。在高性能的應(yīng)用程序中,頻繁的輸出會(huì)導(dǎo)致程序的性能下降,特別是在大規(guī)模數(shù)據(jù)處理和高并發(fā)情況下。YAd28資訊網(wǎng)——每日最新資訊28at.com

缺乏日志級(jí)別

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

無(wú)法集中管理日志

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

2、方案

我們上面也是說(shuō)了,這里在強(qiáng)調(diào)一遍哈:YAd28資訊網(wǎng)——每日最新資訊28at.com

建議使用專門(mén)的日志框架來(lái)管理和控制日志輸出,一些流行的 Java 日志框架包括:Log4j、Logback、SLF4J...YAd28資訊網(wǎng)——每日最新資訊28at.com

四、總結(jié)

雖然 System.out.println() 在快速測(cè)試和學(xué)習(xí)階段很有用,但在實(shí)際的應(yīng)用程序中,頻繁使用它可能會(huì)導(dǎo)致一系列問(wèn)題。YAd28資訊網(wǎng)——每日最新資訊28at.com

因此,建議在生產(chǎn)環(huán)境中使用專門(mén)的日志框架來(lái)管理和控制日志輸出,以便更好地滿足應(yīng)用程序的需求,并提高代碼的可維護(hù)性和可擴(kuò)展性。YAd28資訊網(wǎng)——每日最新資訊28at.com

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

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

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

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

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 主站蜘蛛池模板: 集贤县| 鹿泉市| 清新县| 河北省| 教育| 遂昌县| 邓州市| 始兴县| 高要市| 行唐县| 郴州市| 永修县| 内丘县| 于田县| 内乡县| 乌鲁木齐县| 慈溪市| 南宫市| 瑞丽市| 潜山县| 习水县| 凌海市| 辉县市| 莎车县| 搜索| 荥阳市| 白河县| 科尔| 常宁市| 永胜县| 鄯善县| 渑池县| 杭州市| 伊金霍洛旗| 泸溪县| 论坛| 龙南县| 扎鲁特旗| 大名县| 云南省| 德兴市|