什麼時候使用AtomicReferenceArray
是個好主意?請用一個例子來解釋。AtomicReferenceArray的用途是什麼?
回答
看起來像是在功能上等同於AtomicReference[]
,儘管佔用的內存較少。
因此,當您需要超過一百萬個原子引用時,它非常有用 - 無法想象任何用例。
如果您有大量同時更新的對象,例如在大型多人遊戲中,它可能會很有用。
的參考i
的更新將遵循的模式
boolean success = false;
while (!success)
{
E previous = atomicReferenceArray.get(i);
E next = ... // compute updated object
success = atomicReferenceArray.compareAndSet(i, previous, next);
}
根據不同的情況下,這可能會更快和/或更容易比鎖定()使用。
如果您有一個共享的對象引用數組,那麼您將使用AtomicReferenceArray
來確保該數組不能同時被不同的線程更新,即一次只能更新一個元素。
但是,在AtomicReference[]
(AtomicReference
的數組)中,多個線程仍然可以模擬地更新不同的元素,因爲原子性位於元素上,而不是整個陣列上。
更多信息here。
多個線程可以同時更新AtomicReferenceArray元素。 – irreputable 2010-09-29 17:36:23
他們不能。閱讀我發佈的鏈接。 – dogbane 2010-09-29 17:56:30
那麼'AtomicReferenceArray'和'AtomicReference []'有什麼區別? Sun的實施是由Doug Lea完成的。 – dogbane 2010-09-30 07:08:51
一個可能的用例應該是內部廣泛使用數組的ConcurrentHashMap。數組可以是不穩定的,但是在每個元素級別,語義不能是易失性的。這是自動陣列誕生的原因之一。
import java.util.concurrent.atomic.AtomicReferenceArray;
public class AtomicReferenceArrayExample {
AtomicReferenceArray<String> arr = new AtomicReferenceArray<String>(10);
public static void main(String... args) {
new Thread(new AtomicReferenceArrayExample().new AddThread()).start();
new Thread(new AtomicReferenceArrayExample().new AddThread()).start();
}
class AddThread implements Runnable {
@Override
public void run() {
// Sets value at the index 1
arr.set(0, "A");
// At index 0, if current reference is "A" then it changes as "B".
arr.compareAndSet(0, "A", "B");
// At index 0, if current value is "B", then it is sets as "C".
arr.weakCompareAndSet(0, "B", "C");
System.out.println(arr.get(0));
}
}
}
// Result:
// C
// C
你能解釋一下這段代碼嗎? – Twisty 2016-03-13 16:23:55
- 1. layout.xml的用途是什麼?
- 2. PhoneGap的用途是什麼?
- 3. felix.xml的用途是什麼?
- 4. WSDL的用途是什麼?
- 5. RegisterFmxClasses的用途是什麼?
- 6. FXCollections.observableArrayList的用途是什麼?
- 7. config.assets.precompile的用途是什麼?
- 8. Rake的用途是什麼?
- 9. _dl_sysinfo_int80的用途是什麼?
- 10. javax.security.auth.callback。*的用途是什麼?
- 11. System.Data.SqlClient.SqlParameter.IsNullable的用途是什麼?
- 12. _GLOBAL__I_的用途是什麼?
- 13. $ _POST的用途是什麼?
- 14. RhoMobile的用途是什麼?
- 15. StandardOpenOption.SPARSE的用途是什麼?
- 16. CreateSilverlight.js的用途是什麼?
- 17. ServicePointManager.ServerCertificateValidationCallback的用途是什麼?
- 18. RegisterGlobalFilters的用途是什麼?
- 19. SDL_opengl_glext.h的用途是什麼?
- 20. NSExpression的用途是什麼?
- 21. AutoDiscoverURL的用途是什麼?
- 22. jquery.mobile.structure的用途是什麼?
- 23. JMSTemplate.execute的用途是什麼
- 24. Object.prototype.toString()的用途是什麼?
- 25. RecognizerIntent.DETAILS_META_DATA的用途是什麼?
- 26. Windows.Data.Xml.Dom的用途是什麼
- 27. gulp.src的用途是什麼?
- 28. TransactionSynchronizationRegistry的用途是什麼?
- 29. precompiledApp.config的用途是什麼?
- 30. vertexAttribPointer的用途是什麼?
不完全正確 - 請參閱法赫德的描述答案。 – aperkins 2010-09-29 17:21:39
比接受的答案好得多。它比AtomicReference []節省了空間 - 不安全類的一個副本,它可以處理大量的對象引用。 – themightyjon 2012-10-05 16:15:11