史上最坑爹的 Java 代码:Hello, World!

举报
yd_244540595 发表于 2024/10/14 13:29:13 2024/10/14
【摘要】 作者:码农说Hello, World!Hello, World!是很多Java开发人员写的第一程序,可就是这第一个程序,就把我们华丽丽带到了沟里。(其实也不怪咱们开发人员,主要是好多教材的第一个程序都是Hello, World!)一日掉沟里,很多年还一直在沟里趴着,没出来的同学不在少数。看下面的程序,再熟悉不过了吧。 package com.coderoldgeek.farmer.examp...

作者:码农说


Hello, World!

Hello, World!是很多Java开发人员写的第一程序,可就是这第一个程序,就把我们华丽丽带到了沟里。

(其实也不怪咱们开发人员,主要是好多教材的第一个程序都是Hello, World!)

一日掉沟里,很多年还一直在沟里趴着,没出来的同学不在少数。

看下面的程序,再熟悉不过了吧。

 package com.coderoldgeek.farmer.examples;
 ​
 public class Helloworld {
     public static void main(String[] args) {
         System.out.println("Hello, World!");
     }
 }

原谅我以这样的方式跟大家打招呼,这段代码真的很坑人。

坑点在第5行。

(顺便吆喝一句,技术大厂捞人,有前端、后端、测试等)

自查

有心人可以先自查下自己团队的代码,代码中有没有这个以System.out.println开头的灵魂语句。

 System.out.println("Hello, World!");

如果项目工程中有很多类似System.out.println灵魂语句,但你的项目还没出现过任何问题。

恭喜你,你现在项目的业务并发性十有八九并发性不高。

如果你所处的项目正处在高速发展期,订单量一日千里,那请你立刻马上删除掉这些代码。

对,是立刻马上。

要不哪天你的leader让你拎包走人,你还不知道啥原因就太out了。

看源码

打开System.out.println方法的源码,PrintStream类的println方法

     public void println(String x) {
         synchronized (this) {
             print(x);
             newLine();
         }
     }

一看代码,我相信作为一个有追求的工程师,肯定焕然大悟,这里加锁了,而且是同步锁synchronized

继续看底层源代码,我们看newLine()方法,第3行,看到了吧,也加了锁

     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;
         }
     }

如果你继续往下看flushBuffer方法,也是加锁的。层层枷锁的处理啊。

知识点:synchronized

  • 解决问题:主要解决多个线程之间访问共享资源同步性,用于确保在同一时刻只有一个线程执行共享资源。

  • 用法:3种

    • 非静态方法前加synchronized

    • 静态方法前加synchronized

    • 代码块中加synchronized

      • 锁定代码块中的处理逻辑,System.out.println中是使用的本种方式。
  • 注意点:即使需要同步的场合,一定要注意synchronized的使用方式,同步的处理在确保业务没问题的前提下,同步的处理逻辑一定要最小化,一定要最小化。

第1个重大问题: 性能问题

使用 System.out.println() 输出信息到控制台涉及到文件I/O操作,需要将数据写入控制台。

在高性能的应用程序中,频繁的输出会导致程序的性能下降,特别是在大规模数据处理和高并发情况下。

第2个重大问题:Java开发手册(黄山版)中明确记载

【强制】生产环境禁止使用 System.out 或 System.err 输出或使用 e.printStackTrace() 打印异常堆栈。

说明:标准日志输出与标准错误输出文件每次 Jboss 重启时才滚动,如果大量输出送往这两个文件,容易造成文件大小 超过操作系统大小限制。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。