說我有一個全局對象:如果只有一個線程寫入和多個線程讀取,是否需要添加一些鎖定或同步?
class Global {
public static int remoteNumber = 0;
}
有一個線程定期運行從遠程獲取新號碼,並進行更新(只寫):
new Thread {
@override
public void run() {
while(true) {
int newNumber = getFromRemote();
Global.remoteNumber = newNumber;
Thread.sleep(1000);
}
}
}
而且有一個或多個使用這種全球remoteNumber
隨機線程(只讀):
int n = Global.remoteNumber;
doSomethingWith(n);
你可以看到我不使用任何鎖或synchronize
到PR保護它,這是否正確?有沒有可能導致問題的潛在問題?
更新:
在我而言,它不是真正重要的是,讀線程必須得到實時最新的值。我的意思是,如果有任何問題(導致缺少鎖定/同步),使一個讀取線程錯過該值,這並不重要,因爲它將有機會很快運行相同的代碼(可能在一個循環中)
但不允許讀取未確定的值(我的意思是,如果舊值爲20,新的更新值爲30,但讀取線程讀取的值不是33,我不確定是否可能)
是的,一個線程寫入和多個線程讀取完全是*您需要同步的情況。 – markspace 2014-11-25 07:29:43
對於那個用例,你會遇到可見性問題:讀線程可能看不到全局數字的新值。您至少需要使其變得易變或更好,才能使用AtomicInteger。 – 2014-11-25 07:31:25
閱讀線程可能**從不**看到新的值。爲什麼使用不正確的代碼而不是正確的代碼,特別是當你需要正確的代碼時,使用AtomicInteger或volatile int?你真的認爲這會造成任何性能問題嗎?它不會。 – 2014-11-25 07:39:54