1 回答

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
[Do] 我需要將 isObjectActive() 包裝在同步塊中......?
不。
同步不是針對(duì)方法的,而是針對(duì)數(shù)據(jù)的。在上面顯示的示例中,您可以synchronized從 中刪除塊isObjectActive(),因?yàn)樵摵瘮?shù)不直接訪問state變量,并且它調(diào)用的唯一其他函數(shù)在訪問 時(shí)確實(shí)使用同步state。
你可能應(yīng)該考慮一下調(diào)用的結(jié)果意味著什么,isObjectActive()如果其他線程的操作可以在調(diào)用者有機(jī)會(huì)之前改變對(duì)象的狀態(tài)根據(jù)結(jié)果采取行動(dòng):
MyType mt = ...;
if (mt.isObjectActive()) {
? ? // This is broken because there's no guarantee that mt still will be "active"
? ? // by the time doSomething...() gets called.
? ? //
? ? doSomethingThatOnlyMakesSenseWhen_mt_IsActive(...);
}
添加回答
舉報(bào)