当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2023-10-10 18:31:13 150观看
导读一、前言今天没事干的时候,无意间点到了一个System.out.println()中的println()方法,一个闪亮的关键字冲击着我的眼睛。不知道大家知不知道,那就是加锁的synchronized。但凡有锁的地方肯定会性能是有损耗的,当然得在并发

1Jc28资讯网——每日最新资讯28at.com

一、前言

今天没事干的时候,无意间点到了一个System.out.println()中的println()方法,一个闪亮的关键字冲击着我的眼睛。1Jc28资讯网——每日最新资讯28at.com

不知道大家知不知道,那就是加锁的synchronized。但凡有锁的地方肯定会性能是有损耗的,当然得在并发的情况下!1Jc28资讯网——每日最新资讯28at.com

synchronized在JDK8还是6之后进入了锁升级概念:无锁--->偏向锁--->自旋锁--->轻量级锁--->重量级锁1Jc28资讯网——每日最新资讯28at.com

「轻量级锁和偏向锁通常不涉及内核态切换」1Jc28资讯网——每日最新资讯28at.com

「在到重量级锁时涉及到用户态和内核态的切换,很影响性能的!」1Jc28资讯网——每日最新资讯28at.com

有兴趣的可以自己研究一下synchronized的锁升级和降级!1Jc28资讯网——每日最新资讯28at.com

下面我们回归正题,看一下这个System.out.println()!1Jc28资讯网——每日最新资讯28at.com

二、源码和分析

网上文章很多,大家想看System和out的详细解读,可以去看看哈,这里主要看一下println()这个方法的源码!1Jc28资讯网——每日最新资讯28at.com

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

我们以传进来的是Object对象为例,其他类型比这个少了一个转化为String在输出!1Jc28资讯网——每日最新资讯28at.com

这种方式通常被称为对象级别的锁,因为它是以对象为粒度进行同步的!1Jc28资讯网——每日最新资讯28at.com

print(s);newLine();这两个操作在同一时间只被一个线程执行,以防止输出的内容被多个线程交织在一起,导致输出混乱。1Jc28资讯网——每日最新资讯28at.com

这种同步是为了保证输出的可见性和一致性。当然也带来了性能的损耗,一般情况不会引起线程阻塞,当多个线程尝试同时访问同一个控制台输出时,由于控制台输出的同步性质,可能会导致线程竞争锁,从而导致程序响应慢!1Jc28资讯网——每日最新资讯28at.com

当然在没有并发的场景中,使用一下也没什么,切记不要在输出里面加上大量的运算和转换逻辑。1Jc28资讯网——每日最新资讯28at.com

「但是为了不给后期埋雷,咱们还是尽量不要使用。」1Jc28资讯网——每日最新资讯28at.com

「可以使用专门的日志框架,如Log4j、Logback等,它们提供了更灵活的日志记录和输出控制。」1Jc28资讯网——每日最新资讯28at.com

我们在查看一下:newLine()1Jc28资讯网——每日最新资讯28at.com

我们会发现它也是一个加锁的方法!1Jc28资讯网——每日最新资讯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()也是有锁的!1Jc28资讯网——每日最新资讯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)也是加着锁的!1Jc28资讯网——每日最新资讯28at.com

所以我们还是不要轻易在项目中使用哈,「咱们还是使用日志框架」,还能有不用的日志级别打印,多香!1Jc28资讯网——每日最新资讯28at.com

每天一个小技巧哈!1Jc28资讯网——每日最新资讯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操作,需要将数据写入控制台。在高性能的应用程序中,频繁的输出会导致程序的性能下降,特别是在大规模数据处理和高并发情况下。1Jc28资讯网——每日最新资讯28at.com

缺乏日志级别

System.out.println() 不支持不同的日志级别(如DEBUG、INFO、ERROR等),因此无法将输出信息分类为不同的重要性。在生产环境中,通常需要能够根据日志级别过滤和记录信息。1Jc28资讯网——每日最新资讯28at.com

无法集中管理日志

System.out.println() 输出的信息通常散落在代码的各个地方,不容易集中管理。在实际应用中,通常需要将日志集中存储和管理,以便日后的监控、分析和故障排查。1Jc28资讯网——每日最新资讯28at.com

2、方案

我们上面也是说了,这里在强调一遍哈:1Jc28资讯网——每日最新资讯28at.com

建议使用专门的日志框架来管理和控制日志输出,一些流行的 Java 日志框架包括:Log4j、Logback、SLF4J...1Jc28资讯网——每日最新资讯28at.com

四、总结

虽然 System.out.println() 在快速测试和学习阶段很有用,但在实际的应用程序中,频繁使用它可能会导致一系列问题。1Jc28资讯网——每日最新资讯28at.com

因此,建议在生产环境中使用专门的日志框架来管理和控制日志输出,以便更好地满足应用程序的需求,并提高代码的可维护性和可扩展性。1Jc28资讯网——每日最新资讯28at.com

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

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

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

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

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 三言两语说透设计模式的艺术-简单工厂模式

    三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 服务存储设计模式:Cache-Aside模式

    服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 让我们一起聊聊文件的操作

    让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 三言两语说透柯里化和反柯里化

    三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 每天一道面试题-CPU伪共享

    每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • ESG的面子与里子

    ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    10月30日,据韩国媒体消息,自今年年初以来一直在上涨的 DRAM 存储器的交易价格仅在本月就下跌了近 10%,此次是全年首次降价,而NAND 闪存本月价格与上月持平。市
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top