編寫Java程式,實現多執行緒操作同一個範例變數的操作會引發多執行緒並行的安全問題。

2020-09-28 13:00:49

檢視本章節

檢視作業目錄


需求說明:

多執行緒操作同一個範例變數的操作會引發多執行緒並行的安全問題。現有 3 個執行緒代表 3 只猴子,對類中的一個整型變數 count(代表花的總數,共 20 朵花)進行操作。該變數代表花的總數,不同猴子(執行緒)每採摘一次,花的總數少 1,直至所有花被不同的猴子採摘完,程式結束

實現思路:

  1. 專案中建立 Current 類,在 Current 類中,宣告靜態的 Current 型別參照 current 和 int 型別的範例變數 num,並指定 num 的初始值為 20,代表花的總數
  2. 定義採花 fetch() 方法。在方法中使用同步程式碼塊對 current 物件進行加鎖。在同步程式碼塊中,判斷 num 是否大於 0,如果大於 0,則輸出猴子採花的進度,並讓 num 自減
  3. 重寫 run() 方法。在該方法中建立 while 迴圈,條件為 num 大於 0。迴圈中呼叫 fetch(String name) 方法,通過呼叫 Thread.currentThread().getName() 方法獲取當前執行的執行緒名稱,並將該執行緒名稱賦值給引數 name
  4. 建立程式入口 main() 方法,在該方法中建立 3 條執行緒,並分別為這 3 條執行緒設定名稱為「猴子 A」「猴子 B」和「猴子 C」,依次呼叫 3 個執行緒物件的 start() 方法,啟動執行緒

實現程式碼:


public class T1 implements Runnable {
//	public static T1 t2 = new T1();
	//設定鮮花的數量為20 
	int num = 20;

	@Override
	public void run() {
		synchronized (new T1()) {
			while (num>0) {
				System.out.println("猴子"+Thread.currentThread().getName()+"\t菜花\t"+num--);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	public static void main(String[] args) {
		T1 t1=new T1(); 
		Thread thread = new Thread(t1);
		Thread thread1 = new Thread(t1);
		thread1.setName("B");
		thread.setName("A");
		thread.start();
		thread1.start();
	}
}