201521123089 《Java程序設計》第11周學習總結
阿新 • • 發佈:2017-05-06
提交 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周學習總結