class TimePrinter extends Thread {
private int interval; private String name;
TimePrinter(int ms, String n) { interval=ms; name=n; }
public void run() {
while (true) {
System.out.println(name + ": " + new Date());
Thread.sleep(interval);
}
}
}
new TimePrinter(1000, "Fast").start();
new TimePrinter(3000, "Slow").start();
class TimeTask implements Runnable {
private int interval; private String name;
TimeTask(int ms, String n) { interval=ms; name=n; }
public void run() { /* 同上 */ }
}
new Thread(new TimeTask(1000, "Fast")).start();
new Thread(new TimeTask(3000, "Slow")).start();
優勢:任務類可繼承其他類、無縫投遞線程池、邏輯與控制分離。
class Account {
float balance;
void deposit(float amt) { balance += amt; } // 非原子!
void withdraw(float amt) { balance -= amt; } // 非原子!
}
並發場景下 balance += amt 編譯為 讀-改-寫 三指令,極易丟失更新。
class Account {
float balance;
public synchronized void deposit(float amt) { balance += amt; }
public synchronized void withdraw(float amt) { balance -= amt; }
public float getBalance() { return balance; } // 唯讀可不同步
}
monitor)synchronized 方法自動獲取/釋放 this 鎖getBalance() 未同步,不阻塞也不被阻塞(唯讀安全)void deposit(float amt) {
synchronized (this) { balance += amt; }
// 其他非臨界代碼可並行
}
鎖對象可為任意對象,實現多把鎖分離不同臨界區。