201521123105 第11周Java學習總結
阿新 • • 發佈:2017-05-06
同步互斥 生產 tor 什麽 signal 源代碼 final 本周 執行
1. 本周學習總結
1.1 以你喜歡的方式(思維導圖或其他)歸納總結多線程相關內容。
2. 書面作業
本次PTA作業題集多線程
1. 互斥訪問與同步訪問
完成題集4-4(互斥訪問)與4-5(同步訪問)
1.1 除了使用synchronized修飾方法實現互斥同步訪問,還有什麽辦法實現互斥同步訪問(請出現相關代碼)?
在Java中,提供了兩種方式來實現同步互斥訪問:synchronized和Lock
class Account{ private int balance; private Lock poolLock = new ReentrantLock(); private Condition condition = poolLock.newCondition(); public Account(int balance) { super(); this.balance = balance; } public int getBalance() { return balance; } public void deposit(int money){ poolLock.lock(); try{ this.balance=getBalance() + money; condition.signal(); } finally { poolLock.unlock(); } } public void withdraw(int money){ poolLock.lock(); try{ while (getBalance() <money) { try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } this.balance=getBalance() - money; condition.signal(); } finally{ poolLock.unlock(); } } }
1.2 同步代碼塊與同步方法有何區別?
同步方法是在原子操作的程序代碼前添加synchronized關鍵字,
public static synchronized void addld(){ id++; }
同步代碼塊是在方法中添加synchronized代碼塊,如:
public static void addld(){ synchronized(Counter.class){//synchronized(syncObject),syncObject==上鎖對象 id++; } }
synchronized塊其中的代碼必須獲得對象syncObject(可以是類實例或類)的鎖方能執行。
1.3 實現互斥訪問的原理是什麽?請使用對象鎖概念並結合相應的代碼塊進行說明。當程序執行synchronized同步代碼塊或者同步方法時,線程的狀態是怎麽變化的?
互斥訪問的原理:資源配給任務使用時,在其上加鎖。如果想訪問某項資源的任務必須鎖定這種資源,使其他任務無法訪問它直至這個資源被解鎖,即沒有對象鎖的對象只能進入Lock pool等待線程結束,然後再和其他對象競爭鎖,有鎖才能執行,並且一次只允許一個線程使用該資源,直到所有線程結束。
1.4 Java多線程中使用什麽關鍵字實現線程之間的通信,進而實現線程的協同工作?為什麽同步訪問一般都要放到synchronized方法或者代碼塊中?
Object的wait()、notify()可以用來實現線程之間的協作,另外還有await()等。 同步訪問一般都要放到synchronized方法是為了防止多個線程訪問同一資源所引起的沖突。
2. 交替執行
實驗總結(不管有沒有做出來)
要有一個標誌boolean值來判斷執行哪塊代碼。因為是兩個線程交替執行,線程之間需要相互協作,所以使用了wait,notify,還有flag標誌機制來實現。getSize()方法返回任務為完成的數量,當所有任務都完成後結束程序。
3. 互斥訪問
3.1 修改TestUnSynchronizedThread.java源代碼使其可以同步訪問。(關鍵代碼截圖,需出現學號)
3.2 進一步使用執行器改進相應代碼(關鍵代碼截圖,需出現學號)
參考資料:Java多線程之Executor、ExecutorService、Executors、Callable、Future與FutureTask
4. 線程間的合作:生產者消費者問題
4.1 運行MyProducerConsumerTest.java。正常運行結果應該是倉庫還剩0個貨物。多運行幾次,觀察結果,並回答:結果正常嗎?哪裏不正常?為什麽?
多運行幾次後發現倉庫所剩貨物不為0:
生產者的生產速度和消費者的取貨速度不一致,線程之間沒有合作,就出現混亂。
4.2 使用synchronized, wait, notify解決該問題(關鍵代碼截圖,需出現學號)
4.3 選做:使用Lock與Condition對象解決該問題。
5. 查詢資料回答:什麽是線程安全?(用自己的話與代碼總結,寫自己看的懂的作業)
如果代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全。
6. 選做:實驗總結
201521123105 第11周Java學習總結