Когда это хорошая идея использовать 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);
}
В зависимости от обстоятельств это может быть быстрее и/или проще в использовании, чем замок (synchronized
).
Если у вас есть общий массив ссылок на объекты, то вы должны использовать AtomicReferenceArray
, чтобы гарантировать, что массив не может одновременно обновляться разными потоками, т. Е. Только один элемент может быть обновлен за раз.
Однако в AtomicReference[]
(массив AtomicReference
) несколько потоков могут обновлять различные элементы, поскольку атомарность находится на элементах, а не на массиве в целом.
Дополнительная информация here.
несколько потоков могут одновременно обновлять элементы AtomicReferenceArray. – irreputable
Они не могут. Прочитайте ссылку, которую я опубликовал. – dogbane
Какая разница между 'AtomicReferenceArray' и' AtomicReference [] '? Реализация Солнца - Дуг Ли. – dogbane
Одним из возможных вариантов использования был бы 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
- 1. Работы AtomicReferenceArray
- 2. Что такое использование jQuery.parseXML()
- 3. Что такое использование пустоты?
- 4. Что такое использование str_rot13
- 5. Что такое использование INotifyPropertyChanged?
- 6. Что такое использование Lucene?
- 7. Что такое использование angular.bootstrap
- 8. Что такое использование символов?
- 9. Что такое использование intptr_t?
- 10. Что такое использование Blend,
- 11. Что такое использование plist?
- 12. Что такое использование strnlen?
- 13. Что такое использование asList?
- 14. Что такое использование преобразователей?
- 15. Что такое использование tf.select
- 16. Что такое использование expand_path
- 17. Что такое использование `self.Clients.claim()`
- 18. Что такое использование JavaScript?
- 19. Что такое использование Javaaccessbridge.dll?
- 20. Что такое использование mysql_secure_installation?
- 21. Что такое использование авто?
- 22. Что такое использование API?
- 23. Что такое использование меток?
- 24. Что такое использование gulp-sourcemaps?
- 25. Что такое базовое использование aligned_storage?
- 26. Что такое использование Robot framework?
- 27. Что такое практическое использование System.Transactions?
- 28. ЧТО ТАКОЕ ИСПОЛЬЗОВАНИЕ ОТКРЫТОГО ГОЛОВА?
- 29. Что такое практическое использование Array.prototype.reduce?
- 30. Что такое законное использование const_cast
не совсем правильный - см. Ответ fahd для описания. – aperkins
Гораздо лучший ответ, чем принятый. Это экономит пространство по сравнению с AtomicReference [] - одна копия класса Unsafe, множество ссылок на объекты, на которые он может воздействовать. – themightyjon