1. 程式人生 > >201521123089 《Java程序設計》第11周學習總結

201521123089 《Java程序設計》第11周學習總結

提交 trac 消費者 生產者消費者問題 start nal 出現 選擇 查詢

1. 本周學習總結

1.1 以你喜歡的方式(思維導圖或其他)歸納總結多線程相關內容。

技術分享

2. 書面作業

本次PTA作業題集多線程

Q1.互斥訪問與同步訪問

1.1 除了使用synchronized修飾方法實現互斥同步訪問,還有什麽辦法實現互斥同步訪問(請出現相關代碼)?

public int getBalance() {// synchronized
return balance;
}

public void deposit(int money) {// synchronized
lock.lock();
try {
balance += money;
plus.signalAll();
} 
finally { lock.unlock(); } }


1.2 同步代碼塊與同步方法有何區別?

同步方法就是在方法前加關鍵字synchronized實現加鎖。同步代碼塊則在方法內部加鎖。

1.3 實現互斥訪問的原理是什麽?請使用對象鎖概念並結合相應的代碼塊進行說明。當程序執行synchronized同步代碼塊或者同步方法時,線程的狀態是怎麽變化的?

class Counter {
    private static int id = 0;
    public synchronized static void addId() {
        id++;
    }
    
public synchronized static void subtractId() { id--; } public static int getId() { return id; } }

這個代碼無法獲得對象鎖,多個線程start(),競爭對象鎖,某一線程競爭獲得對象鎖,其余線程在等待池中等待線程釋放對象鎖,當線程釋放對象鎖其余線程又開始競爭對象鎖,直到程序結束。

1.4 Java多線程中使用什麽關鍵字實現線程之間的通信,進而實現線程的協同工作?為什麽同步訪問一般都要放到synchronized方法或者代碼塊中?

使用wait ()、notify()、notifyAll()關鍵字實現線程之間的通信,進而實現線程的協同工作;為了止多個線程訪問同一資源所引起的沖突。

Q2.交替執行

實驗總結

Q3.互斥訪問

3.1 修改TestUnSynchronizedThread.java源代碼使其可以同步訪問。(關鍵代碼截圖,需出現學號)

//201521123089
class Counter {
    private static int id = 0;

    public synchronized static void addId() {
        id++;
    }

    public synchronized static void subtractId() {
        id--;
    }

    public static int getId() {
        return id;
    }
}


3.2 進一步使用執行器改進相應代碼(關鍵代碼截圖,需出現學號)
參考資料:Java多線程之Executor、ExecutorService、Executors、Callable、Future與FutureTask

Q4.線程間的合作:生產者消費者問題

4.1 運行MyProducerConsumerTest.java。正常運行結果應該是倉庫還剩0個貨物。多運行幾次,觀察結果,並回答:結果正常嗎?哪裏不正常?為什麽?

技術分享技術分享

不正常,沒有實現實現線程間的通信、協同。


4.2 使用synchronized, wait, notify解決該問題(關鍵代碼截圖,需出現學號)

技術分享


4.3 選做:使用Lock與Condition對象解決該問題。

Q5.查詢資料回答:什麽是線程安全?(用自己的話與代碼總結,寫自己看的懂的作業)

3. 碼雲上代碼提交記錄

題目集:多線程(4-4到4-10)

3.1. 碼雲代碼提交記錄

在碼雲的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然後搜索並截圖

技術分享

3.2 截圖多線程PTA提交列表

技術分享

技術分享

201521123089 《Java程序設計》第11周學習總結