2 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果只需要線程間通信,而不需要互斥,請(qǐng)使用volatile變量:
private static volatile boolean mRunning = false;
如果只有一個(gè)唯一的線程修改變量,而其他線程僅讀取該變量,則您不需要其他同步volatile就足夠了(它保證任何讀取該字段的線程都將看到最新寫入的值)。
我應(yīng)該這樣做嗎?
public void stop() {
synchronized (this) {
mRunning = false;
}
}
可以,但是不可以!無論如何,您會(huì)得到意想不到的行為(此答案說明了原因)。
在問題描述的情況下,只需使用一個(gè)volatile變量,該變量也不那么冗長(zhǎng),并且與synchronized塊相比,其性能可能更好。

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
這段代碼會(huì)導(dǎo)致不良行為嗎?
它可能。
線程stop()
將能夠設(shè)置為false
共享boolean mRunning
字段的值 。
但是start()
如果未聲明此字段,則線程中的線程可能看不到更改,volatile
因?yàn)檎趫?zhí)行的線程start()
不會(huì)使用當(dāng)前對(duì)象的監(jiān)視器,因此線程內(nèi)存狀態(tài)可能與主內(nèi)存狀態(tài)不同。
因此 start()
可以繼續(xù)在while
語句中循環(huán)。
因此,您必須確保將共享標(biāo)志聲明為volatile boolean mRunning
。
添加回答
舉報(bào)