史上最坑爹的Java代码:Hello, World!
大家好!我是老码农。
《码农说》公众号的第一篇文章我们先从:Hello, World!聊起!
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 重启时才滚动,如果大量输出送往这两个文件,容易造成文件大小 超过操作系统大小限制。
Hello,World!
以这个话题作为《码农说》公众号的第一篇文章,真心是希望作为一个研发人员
-
要不断学习,持续精进自己的技术;
-
突破一些常规,理所当然的想法,很多理所当然的认知都可能会给项目带来巨大的风险。
大家好!我是老码农。今天就分享到这里。
期待未来能与更多的同学有深入的交流,一同学习技术,共同成长。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!