4

Java11之前的java.lang.·System.getProperty() 对性能有影响

 2 years ago
source link: https://www.jdon.com/57415
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Java11之前的java.lang.·System.getProperty() 对性能有影响

'java.lang.System.getProperty()' 是 Java 开发人员用来读取在应用程序启动期间配置的系统属性的常用 API。即,当您将“-DappName=buggyApp”作为应用程序的启动 JVM 参数传递时,可以通过调用“java.lang.System.getProperty()”来读取“appName”系统属性的值。

 “java.lang.System.getProperty()”API 底层使用“java.util.Hashtable.get()”API。请注意,'java.util.Hashtable.get()' 是一个同步 API。这意味着在任何给定时间只有一个线程可以调用“java.util.Hashtable.get()”方法。如果新线程在第一个线程仍在执行时尝试调用“java.util.Hashtable.get()”API,则新线程将处于 BLOCKED 状态。当线程处于 BLOCKED 状态时,它将无法前进。只有当第一个线程完成执行'java.util.Hashtable.get()' API 时,新线程才能继续前进。因此,如果在关键代码路径中调用“java.lang.System.getProperty()”或“java.util.Hashtable.get()”,则会影响事务的响应时间。

以下是解决此问题的潜在解决方案:

  • 1. 升级到 JDK 11:

从 JDK 11 开始,java.util.Properties 中的 Synchronized 'HashTable' 已替换为 'ConcurrentHashMap'。因此,当您升级到 JDK11 时,您将不会遇到此问题。

  • 2.缓存值:

在大量应用程序中,系统属性在运行时不会改变。在这种情况下,我们不必在每个事务上都继续调用“java.lang.System.getProperty()”API。相反,我们可以调用一次“java.lang.System.getProperty()”API,缓存它的值,并在以后的所有调用中返回缓存的值。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK