簡體   English   中英

在兩個線程之間共享相同 object 的主要問題

[英]main problem of sharing same object between two threads

我有兩個線程增加 object myObject的共享變量x

當為每個線程增加這個數字 1000 次時,我沒有得到 2000,我只得到更少。

而且我知道這很糟糕,不應該這樣做,但我只是想弄清楚代碼中發生的“問題”在哪里。

是不是因為在run方法中myObject.x = myObject.x + 1是這樣的:

int temp = myOject.x
temp = temp + 1; //The compiler/something pauses here and goes to thread 2
myObject.x = temp; //Dind't actually get here so no incrementation ?

還是因為兩個線程試圖同時訪問myObject.x ,所以它就像只增加了一個?

線程看起來像這樣:

public class Ex4Incr extends Thread{
    private MyObject myObject;
    public Ex4Incr(MyObject  myObject ) {
        this.myObject = myObject ;
    }   
    @Override
    public void run() {
        for(int i = 0;i < 100;i++) {
            myObject .setX(myObject.getX() + 1);
        }
        System.out.println("id:" + Thread.currentThread().getId() + " x is: " + myObject.getX());
    }
}

很抱歉我沒有添加代碼,但這個問題是眾所周知的,但我只是不知道什么是真實的。

與編譯器無關。 線程調度程序根據調度算法決定運行哪些線程以及暫停哪些線程。 它可能會在變量值之后掛起一個線程,比如2已經讀入temp並運行另一個線程。 該線程現在還讀取變量值2將其增加到3並將其寫回。 如果現在第一個線程繼續運行,它將在第二行繼續運行,因此temp = 2 ,然后遞增到3並將其寫回 memory。 現在我們實際上已經執行了兩次更新,但我們已經完成了兩次相同的更新,因此如果您願意的話,一次更新“丟失”了。

解決此問題的一種簡單方法是使您的int成為AtomicInteger並使用其方法incrementAndGet()

然而,還有其他可能性,例如使用 Monitor( synchronized關鍵字)、Lock 等來解決手頭的問題(稱為Race Condition )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM