亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么這段斷碼是線程不安全的?

為什么這段斷碼是線程不安全的?

慕粉4241372 2018-05-16 10:26:02
public?class?ThreadTest?{ ????private?static?int?threadTotal?=?200; ????private?static?int?clientTotal?=?5000; ????private?static?int?count?=?0; ????public?static?void?main(String[]?args)?throws?InterruptedException?{ ????????ExecutorService?executorService?=?Executors.newCachedThreadPool(); ????????final?Semaphore?semaphore?=?new?Semaphore(threadTotal); ????????final?CountDownLatch?countDownLatch?=?new?CountDownLatch(clientTotal); ????????for?(int?i?=?0;?i?<?clientTotal;?i++)?{ ????????????executorService.execute(()?->?{ ????????????????try?{ ????????????????????semaphore.acquire(); ????????????????????++count; ????????????????????semaphore.release(); ????????????????????countDownLatch.countDown(); ????????????????}?catch?(InterruptedException?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????}); ????????} ????????countDownLatch.await(); ????????System.out.println(count); ????????executorService.shutdown(); ????} }這段代碼操作的是一個static 變量,5000個線程執行了5000次++操作,為什么結果是線程不安全的
查看完整描述

1 回答

已采納
?
一凡

TA貢獻43條經驗 獲得超8個贊

++count的操作實際是三個操作

1 cpu從內存讀取count

2 cpu內部更改count

3 cpu寫入count

多線程的時候,可能會有100個線程同時讀取的值都是0,那么他們++之后寫回去當然就是1,而不是100 。同時在cpu寫入的時候,也不是實時寫入,而是在cpu高速緩存內,所以各個線程內的count數值是不一樣的。

要保證讀寫一致性,需要加入同步的方法來操作。這里只是對count一個變量做++運算,可以用CAS或者鎖。當然JAVA里面的變量屬性 volatile 也是可以保證單個數字更新同步的效果。

這里?new?Semaphore(1); 也可以限制同時只能有一個線程進入++count操作,也能達到線程安全的目的。

查看完整回答
反對 回復 2018-05-23
  • 1 回答
  • 0 關注
  • 1100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號