From 9bab361618a02a8eaa50c75db4733a46d5264a0b Mon Sep 17 00:00:00 2001 From: hezhanfeng Date: Thu, 17 Oct 2024 11:11:28 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9Amulti-thread=20safety=20vulnerabili?= =?UTF-8?q?ties=EF=BC=88=E4=BF=AE=E5=A4=8D=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E9=9D=9E=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E7=9A=84=E6=BC=8F=E6=B4=9E=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/web/response/WorkerStatusVO.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/response/WorkerStatusVO.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/response/WorkerStatusVO.java index c445d124..453887fb 100644 --- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/response/WorkerStatusVO.java +++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/response/WorkerStatusVO.java @@ -6,7 +6,7 @@ import tech.powerjob.common.model.SystemMetrics; import tech.powerjob.common.utils.CommonUtils; import tech.powerjob.server.common.module.WorkerInfo; -import java.text.DecimalFormat; +import java.text.NumberFormat; /** * Worker机器状态 @@ -51,32 +51,37 @@ public class WorkerStatusVO { private static final double THRESHOLD = 0.8; - // 使用 ThreadLocal 为每个线程提供独立的 DecimalFormat 实例 - private static final ThreadLocal DECIMAL_FORMAT_THREAD_LOCAL = ThreadLocal.withInitial(() -> new DecimalFormat("#.#")); - + // 静态 NumberFormat 实例,线程安全 + private static final NumberFormat NUMBER_FORMAT; + // 静态初始化块,配置 NumberFormat 的格式 + static { + NUMBER_FORMAT = NumberFormat.getInstance(); + // 设置最小小数位数为 0 + NUMBER_FORMAT.setMinimumFractionDigits(0); + // 设置最大小数位数为 1 + NUMBER_FORMAT.setMaximumFractionDigits(1); + } public WorkerStatusVO(WorkerInfo workerInfo) { - // 获取当前线程的 DecimalFormat 实例 - DecimalFormat df = DECIMAL_FORMAT_THREAD_LOCAL.get(); SystemMetrics systemMetrics = workerInfo.getSystemMetrics(); this.status = 1; this.address = workerInfo.getAddress(); - this.cpuLoad = String.format(CPU_FORMAT, df.format(systemMetrics.getCpuLoad()), systemMetrics.getCpuProcessors()); + this.cpuLoad = String.format(CPU_FORMAT, NUMBER_FORMAT.format(systemMetrics.getCpuLoad()), systemMetrics.getCpuProcessors()); if (systemMetrics.getCpuLoad() > systemMetrics.getCpuProcessors() * THRESHOLD) { this.status ++; } - String menL = df.format(systemMetrics.getJvmMemoryUsage() * 100); - String menUsed = df.format(systemMetrics.getJvmUsedMemory()); - String menMax = df.format(systemMetrics.getJvmMaxMemory()); + String menL = NUMBER_FORMAT.format(systemMetrics.getJvmMemoryUsage() * 100); + String menUsed = NUMBER_FORMAT.format(systemMetrics.getJvmUsedMemory()); + String menMax = NUMBER_FORMAT.format(systemMetrics.getJvmMaxMemory()); this.memoryLoad = String.format(OTHER_FORMAT, menL, menUsed, menMax); if (systemMetrics.getJvmMemoryUsage() > THRESHOLD) { this.status ++; } - String diskL = df.format(systemMetrics.getDiskUsage() * 100); - String diskUsed = df.format(systemMetrics.getDiskUsed()); - String diskMax = df.format(systemMetrics.getDiskTotal()); + String diskL = NUMBER_FORMAT.format(systemMetrics.getDiskUsage() * 100); + String diskUsed = NUMBER_FORMAT.format(systemMetrics.getDiskUsed()); + String diskMax = NUMBER_FORMAT.format(systemMetrics.getDiskTotal()); this.diskLoad = String.format(OTHER_FORMAT, diskL, diskUsed, diskMax); if (systemMetrics.getDiskUsage() > THRESHOLD) { this.status ++;