簡體   English   中英

各種java線程訪問相同的變量

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

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