首页 > 编程语言 >史上最坑爹的Java代码:Hello, World!

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

时间:2023-12-25 12:34:22浏览次数:35  
标签:Java synchronized System 最坑 println World Hello out

大家好!我是老码农。

《码农说》公众号的第一篇文章我们先从: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!

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

  • 要不断学习,持续精进自己的技术;
  • 突破一些常规,理所当然的想法,很多理所当然的认知都可能会给项目带来巨大的风险。

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

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

标签:Java,synchronized,System,最坑,println,World,Hello,out
From: https://blog.51cto.com/u_16470103/8965710

相关文章

  • java模式之-创建型模式
    typora-copy-images-to:uploadtypora-copy-images-to:upload一、设计模式的概述和分类二、单例模式1、介绍2、单例模式有八种方式:1)饿汉式(单线程推荐)2)懒汉式(线程不安全)3)双重检查(推荐)4、静态内部类(推荐)5、枚举6、注意事项三、工厂设计模式1、简单工厂模式2、工厂方法模式3、......
  • java集合stream操作
    forEach-遍历Stream<Integer>stream=Stream.of(2,3,1,4);stream.forEach(System.out::println);filter-过滤Stream<Integer>stream=Stream.of(2,3,1,4);Stream<Integer>newStream=stream.filter(num->num>2);System.out.pr......
  • 用Java抓取天眼查公开失信人员信息
    做生意不管是大生意小生意讲究的是信用,如果信用不好的人,想必也没有人愿意和他做生意,最近我有几个朋友不是搞的装潢公司么,接了几个单子,想要问问通过一些信息能否查查对方是否是失信人员,当然都是通过正规渠道来的,还是老规矩,直接通过代码过去自动识别抓取。以下是一个简单的Java爬虫程......
  • java读取yaml文件并转化成json格式数据
    一、在maven项目中导入依赖<!--yaml文件转化成json格式--><dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.29</version></de......
  • java md5图片内容加密
    在Java中,你可以使用Java的内置类来生成MD5哈希值。下面是一个示例,展示了如何使用Java将图片内容进行MD5加密:importjava.io.*;importjava.security.*;publicclassImageToMD5{publicstaticvoidmain(String[]args){try{//读取图片文件......
  • 基于java斗车交易系统设计与实现
    21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对斗车交易系统进行了介绍,包括......
  • Java面试小练(十二)
    1).@RequestParam、@RequestBody、@PathVariable是SpringMVC中处理请求参数的三个注解。@RequestParam:用于处理URL中的请求参数,如?name=value。通过@RequestParam注解,可以指定参数的名称、required、defaultValue等属性。@RequestBody:用于处理请求体中的数据,如JSON......
  • 十五.JAVA.MAP.工具类,泛型
    嵌套类/内置类/内部类/内部接口K:keyV:valueE:elementR:ReturnTypeT:typeMap<K,V>:存储的是键值对。每个键值对成为映射项(Entry);键唯一,值是可重复的;每个键最多只能映射到一个值。HashMap:键采用哈希表结构,允许null键null值,线程不安全Like......
  • 十六,JAVA IO流
    //static<T>List<T> emptyList()  //     返回空的列表(不可变的)。  //static<K,V>Map<K,V> emptyMap()  //     返回空的映射(不可变的)。  //static<T>Set<T> emptySet()  //     返回空的set(不可变的)。......
  • Java基础-Spring篇
    Spring框架的七大模块SpringCore:框架的最基础部分,提供IoC容器,对bean进行管理。SpringContext:继承BeanFactory,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化等功能。SpringDAO:提供了JDBC的抽象层,还提供了声明性事务管理方法。SpringORM:提供了JPA、JDO、Hibernate......