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

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

   数栈君   发表于 2024-01-19 10:28  72  0

Hello, World!


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


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


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


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

typescript

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

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


坑点在第5行。


自查


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

csharp

复制代码
 System.out.println("Hello, World!");

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


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


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


对,是立刻马上。


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


看源码


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

scss

复制代码
    public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

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


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

scss

复制代码
     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 重启时才滚动,如果大量输出送往这两个文件,容易造成文件大小 超过操作系统大小限制。



Hello,World!


以这个话题作为《码农说》公众号的第一篇文章,真心是希望作为一个研发人员


  • 要不断学习,持续精进自己的技术;

  • 突破一些常规,理所当然的想法,很多理所当然的认知都可能会给项目带来巨大的风险。

大家好!我是老码农。今天就分享到这里。


期待未来能与更多的同学有深入的交流,一同学习技术,共同成长。

————————————————    
作者:码农说
链接:https://juejin.cn/post/7315846799084355635
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

免责申明:

本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!


《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:https://github.com/DTStack  
0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群