多個股票監控 Task 同時調用「讀取 XML → 修改內存 DOM → 寫回文件」流程,屬於典型的非原子操作。若無同步控制,會發生:
// 定義全局鎖對象
private static final Object xmlLock = new Object();
// 每個 Task 寫入時
synchronized (xmlLock) {
// 1. 讀取/解析 XML
// 2. 修改 DOM
// 3. 寫回文件
}
✅ 簡單直接 | ❌ 僅限單 JVM 進程,分布式無效
FileChannel channel = new RandomAccessFile("trade.xml", "rw").getChannel();
FileLock lock = channel.lock(); // 阻塞直到獲取鎖
try {
// 安全寫入 XML
} finally {
lock.release();
channel.close();
}
✅ 跨進程有效 | ❌ 性能一般,網絡文件系統 (NFS) 支持不穩定
將「寫入請求」解耦為異步任務:
BlockingQueue<TradeEvent>。// 生產者
queue.put(new TradeEvent(stockName, action, price, time));
// 消費者 (單線程循環)
while (running) {
TradeEvent event = queue.take();
appendToXml(event); // 串行寫入,無衝突
}
✅ 高吞吐、無鎖競爭、天然順序一致 | ❌ 需額外線程管理
XML 非為高併發寫入設計。改用嵌入式數據庫:
| 場景 | 推薦方案 |
|---|---|
| 單進程、低併發、數據量小 | synchronized / ReentrantReadWriteLock |
| 單進程、高併發、需高性能 | 生產者-消費者隊列 + 單寫入線程 |
| 多進程/分布式 | 數據庫 (SQLite/PostgreSQL) 或 分布式鎖 |
XML 文件非線程安全存儲介質。核心原則:將「寫入」操作串行化。根據系統規模選擇進程內鎖、文件鎖、隊列串行化或遷移至數據庫。