[英]Various java threads accessing same variable
如果我有 10 個左右的線程訪問同一個變量(只讀取它,不寫入),java 會允許這些線程同時讀取變量還是每個線程都將排隊等待讀取?
我對標准行為感興趣,即沒有特別注意訪問變量。
該程序在 Linux RedHat 上運行。
理想情況下,它會同時讀取它,但在某些情況下並不安全。
例如,如果您聲明:
int i = 1;
Thread threadOne = new Thread() {
public void run() {
i++;
System.out.println("ThreadOne is " + i);
}
};
Thread threadTwo = new Thread() {
public void run() {
i++;
System.out.println("ThreadTwo is "+ i);
}
};
Thread threadThree = new Thread() {
public void run() {
i++;
System.out.println("ThreadThree is " + i);
}
};
threadOne.start();
threadTwo.start();
threadThree.start();
您可以嘗試多次,您會看到結果各不相同。 如果沒有同步,所有線程將“隨機”或“同時”讀寫內存,這取決於誰先完成。
多次運行程序后得到的結果:
ThreadOne is 1
ThreadThree is 3
ThreadTwo is 2
ThreadOne is 3
ThreadThree is 3
ThreadTwo is 3
ThreadTwo is 2
ThreadThree is 3
ThreadOne is 2
如我們所見,所有三個線程都隨機讀取包含 int i 的內存,並通過添加一個來更新 int a。 如果一個線程添加了一個,那么另一個線程將讀取 2。
system.out.println() 也是一個進程。 在第二次嘗試中,它打印所有 3。 意思是三個線程讀完int i並加1后,int i的最終結果變成了3。那么system.out.println會全部打印3。這里還有一種方法可以證明,在所有這些線程中,所有的進程都是同時運行或線程同時運行。
如果您允許而不使用同步,則多個線程可以讀取相同的值。 盡管如果您不更改該值,請確保在長時間讀取之前所有 10 個線程都看到了最新值(可能是初始值)(這至少需要同步一次)。
是的,讀取和寫入將同時完成,為了獲得更高的一致性,您應該將volatile
關鍵字添加到您的變量中。 它仍然不持有鎖,但是如果將來您想以某種方式執行一些更一致的寫操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.