承接上篇架構設計,本文展示核心售票邏輯的 Java 程式碼實作。採用 BigInteger 位元運算表示「車站區間佔用」,結合 Map 管理座位庫存,實現高併發下的無鎖扣減邏輯,並附上效能測試數據。
Map<String,Integer>)、發車日期。ticketFlag (BigInteger) 位元標記、座位類型、銷售渠道、GUID。// 第 i 站到第 j 站:將第 i 到 j-1 位設為 1
public static String buildTicket(int i, int stationNum) {
BigInteger bits = BigInteger.ZERO;
for (int j = i; j < stationNum; j++) {
bits = bits.or(buildSingleStation(j)); // 單站位元
}
return bits.shiftRight(1).toString(); // 右移對齊
}
// A = ~(~A | B) → 若 fromTicket 包含 toTicket 則可售
private static boolean canTicket(BigInteger from, BigInteger to) {
return from.equals(from.not().or(to).not());
}
public static Order createOrder(String ticketStr, List<Ticket> list, Map cond) {
BigInteger want = new BigInteger(ticketStr);
for (Ticket t : list) {
BigInteger have = new BigInteger(t.getTicketFlag());
if (canTicket(have, want) && t.getTicketType().equals(cond.get("ticketType"))) {
Order o = new Order();
o.setTicketFlag(want.toString());
// 關鍵:原地更新票標記,模擬 CAS
t.setTicketFlag(have.or(want).toString());
return o;
}
}
return null;
}
程式碼採用單執行緒模擬,實際生產環境需搭配 AtomicReference 或資料庫樂觀鎖實現真正併發安全。完整類別定義(Train、Ticket、Order、CommonUtil、MainTest)已整理於文章中,可直接下載研究。