1. 程式人生 > >201521123105 第11周Java學習總結

201521123105 第11周Java學習總結

同步互斥 生產 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學習總結