第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

適合新手的并發(fā)編程

適合新手的并發(fā)編程

阿晨1998 2022-05-21 14:08:30
我正在嘗試理解并發(fā)編程,但我不確定一件事。我有一個有兩個線程的程序,它們遞增相同的 int (IntCell n)。在 200 000 次循環(huán)之后 int 應該是 400 000,但它有點超過 200 000 ,然后將其遞增并將其設置為 int 兩次(設置相同 int 的兩次操作)。這是代碼:class IntCell {    private int n = 0;    public int getN() {return n;}    public void setN(int n) {this.n = n;}}class Count extends Thread {    private static IntCell n = new IntCell();    @Override    public void run() {        int temp;        for (int i = 0; i < 200000; i++) {            temp = n.getN();            n.setN(temp + 1);        }    }    public static void main(String[] args) {        Count p = new Count();        Count q = new Count();        p.start();        q.start();        try { p.join(); q.join(); }        catch (InterruptedException e) { }        System.out.println("The value of n is " + n.getN());    }}
查看完整描述

2 回答

?
守候你守候我

TA貢獻1802條經(jīng)驗 獲得超10個贊

兩個線程都可以將 的值復制static IntCell n到它們的線程本地存儲中。


使用volatile關鍵字向線程發(fā)出信號以同步線程本地值和共享值。


static volatile IntCell n

另一個問題是原子性失敗,關鍵區(qū)域:


// Thread 1    // Thread 2

temp = n.getN();

               temp = n.getN();

               n.setN(temp + 1);

n.setN(temp + 1);

使用 sharedn時,n 不會增加 2,而只會增加 1。


synchronize (n) {

    temp = n.getN();

    n.setN(temp + 1);

}

這確保了一個關鍵區(qū)域阻塞在與 相關聯(lián)的信號量上n。


查看完整回答
反對 回復 2022-05-21
?
縹緲止盈

TA貢獻2041條經(jīng)驗 獲得超4個贊

您沒有使用任何類型的同步,這會導致兩個主要問題:

  1. 不能保證一個線程對共享變量所做的更改對另一個線程可見

  2. n在讀取to的當前值和寫入遞增值之間存在競爭條件temp- 另一個線程可能已經(jīng)修改了兩者之間的值,然后這將被覆蓋

可能的解決方案包括使用synchronized-blocks、數(shù)據(jù)包中的鎖java.util.concurrent.locks或支持原子更新的類型,例如AtomicInteger


查看完整回答
反對 回復 2022-05-21
  • 2 回答
  • 0 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號