首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多線程實戰:Thread 繼承 vs Runnable 實現、synchronized 同步機制

     編輯:Java 相關知識

Java 提供兩種建立線程方式:繼承 Thread 或實作 Runnable。本文對比優劣,並以銀行帳戶案例示範 synchronized 解決併發安全問題。

一、兩種建立線程方式

二、程式碼對比

1. 繼承 Thread

class TimePrinter extends Thread {
    int pause; String name;
    TimePrinter(int p, String n) { pause=p; name=n; }
    public void run() {
        while(true) {
            System.out.println(name + ": " + new Date());
            Thread.sleep(pause);
        }
    }
}
new TimePrinter(1000, "Fast").start();
new TimePrinter(3000, "Slow").start();

2. 實作 Runnable (推薦)

class TimePrinter implements Runnable {
    int pause; String name;
    TimePrinter(int p, String n) { pause=p; name=n; }
    public void run() { /* 同前 */ }
}
new Thread(new TimePrinter(1000, "Fast")).start();
new Thread(new TimePrinter(3000, "Slow")).start();

三、synchronized 關鍵字

每個物件擁有一把內部鎖 (Monitor),synchronized 方法/區塊需先獲得鎖才能執行。

銀行帳戶案例 — 未同步 (錯誤)

class Account {
    float balance;
    void deposit(float amt) { balance += amt; }
    void withdraw(float amt) { balance -= amt; }
}

併發存/提導致 balance 更新丟失 (Race Condition)。

修正 — 同步關鍵操作

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; } // 唯讀可不同步
}
  • deposit、withdraw 互斥,同一時間僅一線程執行。
  • getBalance 不加鎖,讀取不阻塞寫入,寫入不阻塞讀取 (但可能讀到舊值,視業務接受度)。

四、進階同步技巧

  • synchronized(this) 同步實例方法;synchronized(Account.class) 同步靜態方法。
  • 縮小同步區塊:synchronized(lock) { critical section },減少鎖持有時間。
  • 避免在同步區塊呼叫外部方法/阻塞 I/O,防止死鎖與效能退化。

五、Java 5+ 替代方案

java.util.concurrent.locks.ReentrantLock 提供可中斷鎖、公平鎖、條件變數 (Condition) 等進階功能,複雜場景優先考慮。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度繼承 Thread實作 Runnable
類別層次強制單繼承,侵入性強可實作多介面,靈活
啟動方式new MyThread().start()new Thread(new MyRunnable()).start()
共享資料需額外傳遞引用天然共享同一 Runnable 實例
推薦度簡單測試生產環境首選