[英]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.