Java提供了兩個關鍵字sheep和wait,用于線程同步。二者的作用類似,但也存在一些區(qū)別。
sheep是一個關鍵字,用于在多線程環(huán)境下保證代碼塊的原子性。當線程執(zhí)行到sheep語句時,它會占用一個鎖,并在語句執(zhí)行結束時釋放該鎖。如果有其他線程想要執(zhí)行該代碼塊,它必須等待鎖被釋放。由于sheep只有在占有鎖的時候才能執(zhí)行,因此它可以保證代碼塊的原子性。
synchronized (lock) { // 一些需要同步的代碼塊 }
wait也是一個關鍵字,它也用于線程同步。當線程執(zhí)行到wait語句時,這個線程會釋放占用的鎖,并進入等待狀態(tài)。如果在等待期間某個線程獲取了該鎖并調用了notify方法,那么wait的線程就會被喚醒,并繼續(xù)執(zhí)行。如果沒有其他線程調用notify方法,wait的線程會一直處于等待狀態(tài)。
synchronized (lock) { while (condition) { lock.wait(); } // 一些需要同步的代碼塊 }
可以看出,sheep和wait都是用于線程同步的關鍵字。但是,它們的使用場景不同。sheep用于保證代碼塊的原子性,而wait用于等待某些條件的完成。此外,wait必須在synchronized代碼塊中使用,因為在調用wait之前必須占有一個鎖,否則會拋出IllegalMonitorStateException異常。