多線程之同步synchronized的使用不當形成java.lang.IllegalMonitorStateException 異常

package com.bjsxt.d822.a2;

public class SubThread9 extends  Thread  {
    /*
     *         當多個對象同時對同一個資源操做,則必須使用同步機制來控制。
     * 
     *         一、當方法去操做共享資源時,則該方法必須經過 synchronized關鍵字來修飾。
     *         二、當方法被 synchronized 關鍵字修飾時,還須要  wait() 和   notify()兩個方法配合使用。
     *             wait()方法是讓當前線程對象進入等待狀態。
     *             notify()方法是讓當前線程對象對喚醒等待者。
     */
    
    
    
    private  int  sum = 0;
    
    @Override
    public  synchronized  void run() {
        String name = this.getName();
        
        System.out.println( name + "統計員,開始統計了.......");
        
        for(int i = 1; i <= 100;  i++ ){
            sum += i;
            try {
                Thread.sleep( 100 );
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        System.out.println(name + "統計員,已將1至100的累加結果統計完畢。");
        
        this.notify(); //喚醒等待者。
    }
    
    //獲取sum的值。
    //public int getSum() {
    public synchronized int getSum() {  //犯過的錯誤:沒有寫synchronized來修飾getSum()方法,以致於出現了java.lang.IllegalMonitorStateException 異常
        try {
            System.out.println( Thread.currentThread().getName() + " 經理在這兒等待結果........");
            this.wait(); //等待
        } catch (InterruptedException e) {
             
        }
        return sum;
    }
}
package com.bjsxt.d822.a2;

public class SubThread9Test {
    public static void main(String[] args) {
        System.out.println( Thread.currentThread().getName() + "  經理,開始工做了...... ");
        
        SubThread9  st = new SubThread9();
        st.setName("張三");
        
        st.start();
        
        System.out.println( st.getName() + " 統計員,你能把1 + 2 + 3 + ... + 100 的結果給個人嗎?");
        
        System.out.println("沒問題,但您須要等一下子。");
        
//        try {
//            Thread.sleep( 15000 );
//        } catch (InterruptedException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
        System.out.println("統計結果是: " + st.getSum() );
    }
}

由於在SubThread9類中getSum()沒有用synchronized 修飾,直接寫成 public int getSum(){} 而致使了異常java.lang.IllegalMonitorStateException的出現html

相關文章
相關標籤/搜索