隨著多核心處理器普及,傳統「共享記憶體 + 鎖」的多執行緒模型面臨死鎖、競態條件、除錯困難等挑戰。Herb Sutter 在 2005 年名文《The Free Lunch is Over》中指出:單核時脈提升已觸頂,軟體效能必須靠並行架構突破。Actor 模型以「訊息傳遞」取代「共享狀態」,天然避開鎖機制,成為並發編程的安全範式。
Kilim 以 Java 實作 Actor 模型,核心概念只有兩個:
kilim.Task 並實作 execute() 方法。關鍵機制:execute() 拋出 Pausable,經由 Weaver(位元碼編織器) 在編譯後插入排程碼,少量核心執行緒即可驅動大量 Task,上下文切換極快。
public class Calculation {
private BigDecimal dividend, divisor, answer;
// getter/setter/printAnswer()...
}
public class DeferredDivision extends Task {
private Mailbox<Calculation> mailbox;
public DeferredDivision(Mailbox<Calculation> mb) { this.mailbox = mb; }
@Override
public void execute() throws Pausable, Exception {
Random rnd = new Random();
MathContext mc = new MathContext(8);
while (true) {
// 非阻塞發送
mailbox.putnb(new Calculation(
new BigDecimal(rnd.nextDouble(), mc),
new BigDecimal(rnd.nextDouble(), mc)));
Task.sleep(1000);
// 非阻塞檢查結果
Calculation ans = mailbox.getnb();
if (ans != null && ans.getAnswer() != null)
System.out.println("Answer: " + ans.printAnswer());
}
}
}
public class Calculator extends Task {
private Mailbox<Calculation> mailbox;
public Calculator(Mailbox<Calculation> mb) { this.mailbox = mb; }
@Override
public void execute() throws Pausable, Exception {
while (true) {
// 阻塞等待訊息
Calculation calc = mailbox.get();
if (calc.getAnswer() == null) {
calc.setAnswer(calc.getDividend()
.divide(calc.getDivisor(), 8, RoundingMode.HALF_UP));
// 非阻塞回傳結果
mailbox.putnb(calc);
}
Task.sleep(1000);
}
}
}
public class CalculationCooperation {
public static void main(String[] args) {
Mailbox<Calculation> shared = new Mailbox<>();
new DeferredDivision(shared).start();
new Calculator(shared).start();
}
}
<target name="weave" depends="compile">
<java classname="kilim.tools.Weaver" fork="yes">
<classpath refid="classpath"/>
<arg value="-d"/> <arg value="./target/classes"/>
<arg line="./target/classes"/>
</java>
</target>
編譯 → 執行 weave → 運行時載入 kilim.jar 即可享受高效能排程。
| 優點 | 缺點/注意 |
|---|---|
| 無鎖、無死鎖、程式碼線性易讀 | 需額外編織步驟,建置流程稍複雜 |
| 輕量 Task 可支援百萬級並發 | 生態系較 Akka 小,社區更新較慢 |
| 與現有 Java 程式碼無縫整合 | 阻塞式 API 需搭配 Pausable,學習曲線較平緩但仍需適應 |
適合:高併發、事件驅動、微服務內部非同步處理、遊戲伺服器、即時資料管道。
Kilim 以極簡 API 將 Actor 模型帶入 Java,配合位元碼編織實現高效能輕量執行緒。若團隊尚未引入 Akka 等重型框架,Kilim 是「低門檻、高回報」的並發升級選擇。