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

Java 多線程生產消費模式:wait/notify 協同、旗標變數與同步鎖詳細解析

     編輯:程式設計綜合問答

程式碼展示經典 **單缓衝區** 生產者-消費者模型:

  • Res 共享資源:name, sex, flag (是否有資料)。
  • set() 生產:flag==true → wait();寫入後 flag=true; notify()。
  • out() 消費:flag==false → wait();讀取後 flag=false; notify()。

關鍵點逐行解析

public class Res {
    private String name, sex;
    private boolean flag = false; // false=空, true=滿

    public synchronized void set(String name, String sex) {
        while (flag) {           // 用 while 防虛假喚醒
            try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); }
        }
        this.name = name; this.sex = sex;
        flag = true;
        this.notify();           // 喚醒消費者
    }

    public synchronized void out() {
        while (!flag) {
            try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); }
        }
        System.out.println(name + "...." + sex);
        flag = false;
        this.notify();           // 喚醒生產者
    }
}

為什麼構造函數傳 Res r?

Input(Res r) { this.r = r; } 將**同一個共享物件引用**傳給生產者與消費者執行緒,確保它們操作的是**同一把鎖、同一組旗標**。若各自 new Res() 則無法協同。

進階改進

  • 使用 java.util.concurrent.ArrayBlockingQueue 替代手動 wait/notify,簡潔且無錯誤。
  • 多生產/消費者時改用 notifyAll() 避免信號遺漏。

理解「共享物件 + 同步鎖 + 旗標 + wait/notify」四要素,即可掌握 Java 線程協作核心。

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