system类绝大多数静态方法是线程安全的,因其无内部可变状态,关键操作由jvm或os保证原子性;但system.out/err混合写入可能交错,in.read()需调用方同步,setsecuritymanager()存在竞态风险。

System 类中绝大多数静态方法是线程安全的。
System 类的线程安全性设计
System 是一个纯静态工具类,所有字段(in、out、err)和方法(如 currentTimeMillis()、nanoTime()、arraycopy()、getProperties()、getenv() 等)均为 static,且内部实现普遍采用同步机制或无状态操作保障并发安全。
- currentTimeMillis() 和 nanoTime():底层调用操作系统时钟接口,本身无共享状态,天然线程安全;
- arraycopy():是 native 方法,JVM 保证其原子性和执行一致性,多个线程并发调用不会相互干扰;
- getProperties() 和 getenv():返回的是不可变副本(如 unmodifiableMap),避免外部修改影响内部状态;
- setProperty() / clearProperty():虽可修改系统属性,但 JDK 内部使用 synchronized 或 volatile 配合锁机制保护,保证可见性与操作顺序;
- gc()、runFinalization():属于提示型操作,不依赖共享可变状态,线程安全。
需特别注意的非完全线程安全场景
虽然方法本身安全,但使用方式可能引入问题:
-
System.out / System.err 的混合写入:多个线程同时调用
println()可能导致输出内容交错(如两行日志混在一起),这不是方法不安全,而是 PrintStream 内部缓冲与 flush 时机造成的现象; -
in.read() 等 I/O 操作:System.in 是 InputStream 实例,其
read()方法本身未同步,若多线程共用并读取,需由调用方自行同步; - 自定义 SecurityManager 配合 setSecurityManager():该方法已废弃,且设置过程涉及全局状态变更,高并发下存在竞态风险,应避免使用。
总结:安全但有边界
System 类的设计目标就是供任意线程随时调用——它不维护内部可变状态,关键操作委托给 JVM 或 OS 层保证原子性。只要不把它的流对象(out/err/in)当作共享资源直接裸用,常规调用完全无需额外加锁。











