Kiedy to jest dobry pomysł, aby użyć AtomicReferenceArray
? Proszę wyjaśnić na przykładzie.Jaki jest pożytek z AtomicReferenceArray?
Odpowiedz
wygląda na to, że jest funkcjonalnie równoważne AtomicReference[]
, zajmując jednak nieco mniej pamięci.
Jest to przydatne, gdy potrzebujesz więcej niż milion odniesień atomowych - nie można wymyślić żadnego przypadku użycia.
Może to być przydatne, jeśli masz dużą liczbę obiektów aktualizowanych jednocześnie, na przykład w dużej grze wieloosobowej.
Aktualizacja odniesienia i
byłoby zgodne z wzorcem
boolean success = false;
while (!success)
{
E previous = atomicReferenceArray.get(i);
E next = ... // compute updated object
success = atomicReferenceArray.compareAndSet(i, previous, next);
}
W zależności od okoliczności może to być szybsze i/lub łatwiejsze w użyciu niż blokujący (synchronized
).
Jeśli dysponujesz wspólną tablicą referencji do obiektów, użyjesz AtomicReferenceArray
, aby zapewnić, że tablica nie może być aktualizowana jednocześnie przez różne wątki, tj. Tylko jeden element może być aktualizowany na raz.
Jednak w AtomicReference[]
(tablica z AtomicReference
) wiele wątków może nadal aktualizować różne elementy w sposób symulujący, ponieważ atomowość jest na elementach, a nie na tablicy jako całości.
Więcej informacji here.
wiele wątków może jednocześnie aktualizować elementy AtomicReferenceArray. – irreputable
Nie mogą. Przeczytaj opublikowany przeze mnie link. – dogbane
Następnie jaka jest różnica między 'AtomicReferenceArray' i' AtomicReference [] '? Implementacja Sun jest autorstwa Douga Lea. – dogbane
Jednym z możliwych przypadków użycia byłaby funkcja ConcurrentHashMap, która intensywnie wykorzystuje tablicę wewnętrznie. Tablica może być niestabilna, ale na poziomie każdego elementu, sematycy nie mogą być niestabilne. to jeden z powodów powstania automatycznej tablicy.
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
Czy mógłbyś wyjaśnić ten kod? – Twisty
- 1. Jaki jest pożytek z __RequestVerificationToken?
- 2. Jaki jest pożytek z System.in.read()?
- 3. Jaki jest pożytek z window.external?
- 4. Jaki jest pożytek z typedef?
- 5. Jaki jest pożytek ze składni: =?
- 6. jaki jest pożytek z MemoryFile w Androidzie
- 7. Jaki jest pożytek z Invoke() w .net?
- 8. Jaki jest pożytek z posiadania? w java
- 9. Jaki jest pożytek z rozliczenia udevadm?
- 10. Jaki jest pożytek z -fno-stack-protector?
- 11. Jaki jest pożytek z zestawów wyświetlacza iCloud?
- 12. Jaki jest pożytek z ^: dynamic na defonce?
- 13. Jaki jest pożytek z adnotacją Hibernate @LazyCollection
- 14. Jaki jest pożytek z DECIMAL (x, 0)?
- 15. Jaki jest pożytek z performSelector w iOS
- 16. Jaki jest pożytek z tokena przeciw fałszerstwu?
- 17. jaki jest pożytek z metody Long.reverse (długiej)?
- 18. Jaki jest pożytek z pliku entitlements.plist?
- 19. Jaki jest pożytek z Array.prototype.slice.call (array, 0)?
- 20. Semafor - Jaki jest pożytek z początkowego liczenia?
- 21. Jaki jest pożytek z style = "clear: both"?
- 22. Jaki jest pożytek z Deployment.Current.Dispatcher.BeginInvoke (() => {...})?
- 23. Jaki jest pożytek z - [NSUserDefaults registerDefaults:]?
- 24. Jaki jest pożytek z $ # w Bash
- 25. Jaki jest pożytek z "echo || true"?
- 26. Jaki jest pożytek z __kwdefaults__, który jest atrybutem funkcji funkcji?
- 27. Jaki jest pożytek z udostępnionej zmiennej w VB.NET?
- 28. Jaki jest pożytek z etykiety worka w Hibernate?
- 29. jaki jest pożytek z klasy ArraySegment <T>?
- 30. Windows Azure - Jaki jest pożytek z wewnętrznego adresu IP?
nie do końca poprawne - patrz odpowiedź fahda dla opisu. – aperkins
Znacznie lepsza odpowiedź niż zaakceptowana. Oszczędza przestrzeń w porównaniu do AtomicReference [] - jedna kopia klasy Unsafe, wiele odwołań do obiektów, na które może działać. – themightyjon