偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開發(fā) 后端
synchronized在JDK8還是6之后進(jìn)入了鎖升級(jí)概念:無(wú)鎖--->偏向鎖--->自旋鎖--->輕量級(jí)鎖--->重量級(jí)鎖,輕量級(jí)鎖和偏向鎖通常不涉及內(nèi)核態(tài)切換,在到重量級(jí)鎖時(shí)涉及到用戶態(tài)和內(nèi)核態(tài)的切換,很影響性能的!

一、前言

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

不知道大家知不知道,那就是加鎖的synchronized。但凡有鎖的地方肯定會(huì)性能是有損耗的,當(dāng)然得在并發(fā)的情況下!

synchronized在JDK8還是6之后進(jìn)入了鎖升級(jí)概念:無(wú)鎖--->偏向鎖--->自旋鎖--->輕量級(jí)鎖--->重量級(jí)鎖

「輕量級(jí)鎖和偏向鎖通常不涉及內(nèi)核態(tài)切換」

「在到重量級(jí)鎖時(shí)涉及到用戶態(tài)和內(nèi)核態(tài)的切換,很影響性能的!」

有興趣的可以自己研究一下synchronized的鎖升級(jí)和降級(jí)!

下面我們回歸正題,看一下這個(gè)System.out.println()!

二、源碼和分析

網(wǎng)上文章很多,大家想看System和out的詳細(xì)解讀,可以去看看哈,這里主要看一下println()這個(gè)方法的源碼!

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在輸出!

這種方式通常被稱為對(duì)象級(jí)別的鎖,因?yàn)樗且詫?duì)象為粒度進(jìn)行同步的!

print(s);newLine();這兩個(gè)操作在同一時(shí)間只被一個(gè)線程執(zhí)行,以防止輸出的內(nèi)容被多個(gè)線程交織在一起,導(dǎo)致輸出混亂。

這種同步是為了保證輸出的可見性和一致性。當(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)慢!

當(dāng)然在沒(méi)有并發(fā)的場(chǎng)景中,使用一下也沒(méi)什么,切記不要在輸出里面加上大量的運(yùn)算和轉(zhuǎn)換邏輯。

「但是為了不給后期埋雷,咱們還是盡量不要使用?!?/p>

「可以使用專門的日志框架,如Log4j、Logback等,它們提供了更靈活的日志記錄和輸出控制?!?/p>

我們?cè)诓榭匆幌拢簄ewLine()

我們會(huì)發(fā)現(xiàn)它也是一個(gè)加鎖的方法!

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()也是有鎖的!

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)也是加著鎖的!

所以我們還是不要輕易在項(xiàng)目中使用哈,「咱們還是使用日志框架」,還能有不用的日志級(jí)別打印,多香!

每天一個(gè)小技巧哈!

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ù)寫入控制臺(tái)。在高性能的應(yīng)用程序中,頻繁的輸出會(huì)導(dǎo)致程序的性能下降,特別是在大規(guī)模數(shù)據(jù)處理和高并發(fā)情況下。

缺乏日志級(jí)別

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

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

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

2、方案

我們上面也是說(shuō)了,這里在強(qiáng)調(diào)一遍哈:

建議使用專門的日志框架來(lái)管理和控制日志輸出,一些流行的 Java 日志框架包括:Log4j、Logback、SLF4J...

四、總結(jié)

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

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

責(zé)任編輯:姜華 來(lái)源: 小王博客基地
相關(guān)推薦

2009-07-07 08:33:51

微軟Windows 7操作系統(tǒng)

2012-02-01 13:54:54

Java游戲

2014-09-30 11:35:48

安卓市場(chǎng)

2010-06-17 17:09:13

甲骨文Sun裁員

2009-06-05 08:48:12

2022-09-22 07:31:14

Java變量計(jì)算

2025-03-27 10:30:51

2020-07-10 16:52:43

DelveGo程序開源

2022-02-23 22:01:23

SpringAOP模式

2013-01-05 02:11:39

工程師程序員

2019-10-22 13:29:11

密碼身份和訪問(wèn)管理IAM

2021-12-23 09:30:35

Java 字節(jié)流 Java 基礎(chǔ)

2012-11-26 12:51:44

木材3D打

2016-11-03 06:27:17

三星科技新聞早報(bào)

2024-09-11 14:59:00

2024-09-23 12:35:49

2009-08-21 16:05:04

C#使用ref和out

2010-01-07 14:31:59

Ubuntu編譯

2019-02-28 10:18:44

GitHub 技術(shù)開源

2019-12-30 11:25:06

Jvm運(yùn)行java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)