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

Java 多線程實戰核心:Thread/Runnable 實現、synchronized 同步與賬戶線程安全案例

     編輯:J2EE

Thread 繼承模式

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();

Runnable 解耦模式(推薦)

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();

優勢:任務類可繼承其他類、無縫投遞線程池、邏輯與控制分離。

synchronized 關鍵字:線程安全基石

問題:銀行賬戶並發存取

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; }
    // 其他非臨界代碼可並行
}

鎖對象可為任意對象,實現多把鎖分離不同臨界區。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved