wait,sleep實例二

sleep會不會讓出鎖,帶着問題看實例二,不明白實例二是啥,請先看實力一this

package synchronize;線程

public class ThreadSleepTest implements Runnable{
    int number = 10;
    public void firstMethod() throws Exception {
        synchronized (this) {
            number += 100;
            System.out.println(number);
        }
    }
    /*咱們來大體分析一下此段代碼,main()方法中實例化ThreadTest並啓動該線程,而後調用該線程的一個方法(secondMethod()),由於在主線程中調用方法,
     因此調用的普通方法secondMethod())會先被執行(但並非普通方法執行完畢該對象的線程方法才執行,普通方法執行過程當中,該線程的方法也會被執行,
     他們是交替執行的,只是在主線程的普通方法會先被執行而已),因此程序運行時會先執行secondMethod(),
     而secondMethod()方法代碼片斷中有synchronized block,所以secondMethod方法被執行後,該方法會佔有該對象機鎖致使該對象的線程方法一直處於阻塞狀態,
    不能執行,直到secondeMethod釋放鎖;
    使用Thread.sleep(2000)方法時,由於sleep在阻塞線程的同時,並持有該對象鎖,因此該對象的其餘同步線程(secondMethod())沒法執行,
    直到synchronized block執行完畢(sleep休眠完畢),secondMethod()方法才能夠執行,所以輸出結果爲number*200+100;
    使用this.wait(2000)方法時,secondMethod()方法被執行後也鎖定了該對象的機鎖,執行到this.wait(2000)時,該方法會休眠2S並釋當前持有的鎖,
    此時該線程的同步方法會被執行(由於secondMethod持有的鎖,已經被wait()所釋放),所以輸出的結果爲:number+100;*/
    
    public void secondMethod() throws Exception {
        synchronized (this) {
            /**
             * (休息2S,阻塞線程)
             * 以驗證當前線程對象的機鎖被佔用時,
             * 是否被能夠訪問其餘同步代碼塊
             */
            //Thread.sleep(2000);
            this.wait(2000);
            number *= 200;
            System.out.println(number);
        }
    }
    public void run() {
        try {
            firstMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        ThreadSleepTest threadTest = new ThreadSleepTest();
        Thread thread = new Thread(threadTest);
        thread.start();
        threadTest.secondMethod();
    }
}
 對象

相關文章
相關標籤/搜索