百木园-与人分享,
就是让自己快乐。

深入理解为什么不要使用System.out.println()

关于项目中为什么不要使用System.out.println()的解释,网上有很多资料却并不准确或者详细,今天小星就其原因以及可能对项目造成的影响做深入剖析。

本篇文章氛围三个 要点,源码解析、影响分析、代码演示。

原文出处:https://www.cofestar.com/blog/system-out-println.html

一、源码解析

打开println的源码,看到println方法体中有synchronized,也就是有锁的控制,换而言之就会出现阻塞的可能,后面我们会认为制造阻塞来演示。

如下图:

 

打开out源码,发现out用final static来修饰,也就是静态变量,可以认为在单机jvm中该变量全局唯一,如下图:

 

二、影响分析

通过以上两个图,我们可以想到有这么一种场景,在System.out.println()运行过程中,或因系统原因或者其它原因,导致在执行println的时候,发生了阻塞,那么因此带来的后果是,所有使用System.out.println()的地方,都会处于block状态,甚至引发系统宕机等。

至于System.out.println()本身的性能问题,可以作为单纯的性能优化来讲,也是不建议使用,既然是深入分析,我们先看下严重的场景,这才是导致禁用Syste.out.println()的重要原因。

 

三、代码模拟

我们根据源码,模拟这么一种场景,由于某种原因,System.out处于锁定状态,长时间没有释放,会引发什么。

模拟步骤:

1、新建两个线程:线程一和线程二

2、让线程一和线程二运行三秒后,开始对System.out进行锁定

3、查看线程一和线程二在System.out锁定时的打印情况及线程状态

4、释放System.out锁,在此查看线程一和线程二的运行情况

以下是测试代码:

此处运行逻辑是按照方才的说明步骤进行,线程中仅仅使用System.out.println进行打印,在System.out处于锁定状态时,查看两个线程是否会继续打印

线程中每隔1.5秒打印一次。

我们运行打印程序,查看控制台日志:

 

结论:

通过控制台日志可以看到,线程一和线程二在运行过程中,如果System.out处于锁定时,两个线程处于BLOCKED状态,且不在进行打印,等待10秒System.out锁释放后,又开始重新执行打印。

所以说,生产上如果大量使用System.out.println(),将会对所有使用该语句的逻辑造成阻塞,影响不言而喻。

来源:深入理解为什么不要使用System.out.println()

经常在出差路上,做个应用 

jcold 


来源:https://www.cnblogs.com/apistore/p/16070146.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 深入理解为什么不要使用System.out.println()

相关推荐

  • 暂无文章