使用ConcurrentHashMap配合多线程分别读取多个独立配置文件(如db.conf、api.conf),各线程解析后安全聚合到共享映射中,避免竞态与I/O竞争,并通过固定线程池和资源自动释放保障稳定性。

在简单控制台项目中,用并发映射(如 ConcurrentHashMap)配合文件流实现多线程配置读取,核心是让多个线程安全地加载、解析并共享配置项,避免重复读取、竞态修改或阻塞主线程。关键不在于“同时打开同一个文件”,而在于“并发读取不同配置源 + 安全聚合结果”。
明确分工:每个线程读一个配置文件
并发读取不是让 10 个线程抢着读同一份 config.properties,而是把配置拆成多个独立文件(如 db.conf、api.conf、log.conf),每个线程负责一个。这样天然规避了文件锁和 I/O 竞争。
- 准备多个小配置文件,格式统一(例如 key=value 或 JSON)
- 主线程收集文件路径列表,提交给线程池
- 每个工作线程用
FileInputStream+Properties或JsonReader解析对应文件
用 ConcurrentHashMap 安全汇聚配置结果
普通 HashMap 在多线程写入时会出错;ConcurrentHashMap 允许并发 put,且保证最终一致性。它适合做配置的“合并容器”——各线程解析完自己的键值对后,直接 putAll() 或逐个 put() 进去。
- 声明为
static final ConcurrentHashMap<string string> config = new ConcurrentHashMap();</string> - 线程解析出
Map<String, String> parsed后,调用config.putAll(parsed) - 无需额外同步,putAll 是线程安全的(分段锁或 CAS 实现)
控制并发粒度与资源释放
控制台项目不需要高吞吐,但要防止线程失控或文件句柄泄漏:
- 使用固定大小线程池(如
Executors.newFixedThreadPool(3)),避免创建过多线程 - 每个线程内务必在
finally或 try-with-resources 中关闭InputStream和Reader - 主线程用
CountDownLatch或executor.awaitTermination()等待全部完成
示例结构(Java 控制台)
主类中:
- 初始化
ConcurrentHashMap<String, String> - 构造文件路径列表:
List<String> paths = Arrays.asList("conf/db.conf", "conf/api.conf") - 提交任务:
executor.submit(() -> loadConfigFromFile(path, config)) - 等待结束,然后直接用
config.get("db.url")获取任意配置项

















