12 回答

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
并發(fā)數(shù)據(jù)覆蓋問(wèn)題,斷點(diǎn)在你這個(gè)例子里面是調(diào)試不出來(lái)的。
i+=1;在斷點(diǎn)模式下。它是一次操作。
你要明白多線程i+=1;為什么會(huì)出錯(cuò)。
?
線程1:讀取i=0;
線程2:讀取i=0;
?
線程1:計(jì)算i+1;
線程2:計(jì)算i+1;
?
線程1:計(jì)算結(jié)果回寫i變量;i=1;
線程2:計(jì)算結(jié)果回寫i變量;i=1;

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
加法不是原子操作,不能夠這樣加
你在debug模式下會(huì)中斷線程的運(yùn)行,導(dǎo)致數(shù)據(jù)會(huì)被強(qiáng)制同步一次,因此你是無(wú)法察覺(jué)這種錯(cuò)誤的。

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
@幻空城: 所以說(shuō)多線程麻煩咯,不是麻煩在寫法上,而是麻煩在這些東西上,比如線程安全性,線程任務(wù)如何分配(不能一個(gè)線程累死,其他的餓死)。所以很多時(shí)候會(huì)使用其他方式進(jìn)行規(guī)避,比如actor模式。

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
@Daniel Cai:?
每個(gè)線程都有自己空間,把變量都弄到自己內(nèi)存計(jì)算后放回共享空間
這句話該怎么理解呢

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
@Daniel Cai:?比如說(shuō):共享數(shù)據(jù) i:
//這里i的值是不是從共享內(nèi)存中獲取到i到線程內(nèi)存中
int temp=i;
//這里的i值是不是從共享中取,還是線程中上面已經(jīng)緩存的i值,計(jì)算完是不是寫回共享內(nèi)存。
i+=1;
//這里的i值是不是從共享中取,還是從線程中上面已經(jīng)緩存的i值,計(jì)算完是不是寫回共享內(nèi)存。
i+=2;

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
@Daniel Cai: 非常感謝你說(shuō)了這么多,雖然你只是說(shuō)泛泛一下,覺(jué)得自己不懂的還很多。進(jìn)一步了解后再來(lái)細(xì)問(wèn)。謝了
添加回答
舉報(bào)