CS209A · ASSIGNMENT 2 · CONCURRENCY IN ACTION

QQ 农场 · Terminal + JavaFX GUI

模拟 Java Socket + 多线程 + synchronized 互斥锁。左边终端输入命令,右边 JavaFX 风格窗口实时显示农场状态。

CONCURRENCY RULES

How It Works

四条并发规则保证偷菜系统的线程安全

synchronized 互斥锁

每个受害者(victim)对应一个锁。同一时间只有一个线程能进入临界区执行偷菜操作,其他线程必须等待锁释放。

01

在家保护机制

如果受害者正在查看自己的农场(viewing own farm),所有偷菜请求都会被拒绝。只有受害者不在家时才能被偷。

02
25%

25% 偷菜上限

每次访问会话(visit → leave → revisit)最多只能偷走成熟作物的 25%。离开再回来算新会话。

03

CountDownLatch 并发测试

两个客户端同时偷菜 — 使用 Promise.all 模拟 CountDownLatch,观察 mutex 如何序列化并发访问。

04
STEP-BY-STEP GUIDE

Click each step to run the command

1
java -jar Server.jar
启动服务器。模拟 ServerSocket 在 5050 端口监听。NPC(bob, charlie, diana)自动连接。
2
login alice
以 "alice" 身份登录。初始 40 金币。JavaFX 窗口显示你的农场。
3
plant 0 0
在 (0,0) 种菜。花费 5 金币。作物立即成熟为 🌻。
4
plant 1 1
在 (1,1) 种菜。现在你有 2 个成熟作物了。
5
visit bob
访问 bob 的农场。JavaFX 切换到 bob 的作物。开始新的偷菜会话。
6
steal bob
偷 bob 的菜!进入 synchronized(victim) 临界区。获得 +3 金币。
7
demo
🎬 自动演示一次完整的成功偷菜流程 — visit → steal → 结果分析。
8
concurrent
⚡ CountDownLatch!两个线程同时偷菜,观察互斥锁如何序列化访问。
自动执行完整演示
Client.java — localhost:5050
╔══════════════════════════════════════════════════╗
║ CS209A Assignment 2 — QQ Farm Terminal v1.0 ║
║ Java Socket + Multithreading + synchronized ║
╚══════════════════════════════════════════════════╝
输入 help 查看命令列表,或点击上方步骤按钮开始
快捷:
🌻 QQ Farm — Not Logged In
File Actions Help
Player:
Coins: 0
Status: Waiting for login...
Viewing:
Farm Grid
Ready. Click a step above or type a command.