Небезопасным является краеугольным камнем операции без блокировки Java, и они являются незаменимыми в классах параллелизма без блокировки. Например, concurrenthashmap и coundrentlinkedqueue - все это небезопасно. По сравнению с замками на Java, в основном нет накладных расходов и будет ждать на месте. Эта статья в основном представляет основные операции в небезопасных.
1 CompareAndswap
/*** Сравните значение в местоположении памяти в смещении OBJ и ожидаемом значении и обновите, если то же самое. Это обновление не прерывается. ** @param obj объект, который необходимо обновить* @param смещение смещения целочисленного поля в obj* @param ожидает ожидаемого значения в области* @param update, если ожидаемое значение ожидается, что текущее значение для поля, установите значение FiledAndeNdsWAPINT* @retur обновлять);
Это знаменитая операция CAS, которая разделена на три шага
Семейство CAS также включает в себя CompareAndswapobject (), CompareAndswaplong (), CompareAndswapint () и т. Д.
Используйте классический пример от AtomicInteger, чтобы проиллюстрировать:
public final int getandadd (int delta) {return uncafe.getandadDint (this, valueOffset, delta);} // uncafe.getAndAdDintPublic final int getAndAddint (Object var1, long var2, int var4) {int var5; do { / ** получить исходное значение* / var5 = this.getIntvolatile (var1, var2); / ** Убедитесь, что исходное значение не было изменено другими потоками, затем выполните обновление операции var5 + var4*/} while (! This.compareAndswapint (var1, var2, var5, var5 + var4)); вернуть var5;}2 PUTORDER
/**** Устанавливает значение целочисленного поля в указанном смещении в* предоставленном объекте к данному значению. Это упорядоченная или ленивая * версия <code> putintvolatile (Object, long, int) </code>, которая * не гарантирует немедленную видимость изменения других * потоков. Это действительно полезно, если целочисленное поле составляет * <code> volatile </code> и, таким образом, ожидается неожиданно измениться. * * @param obj объект, содержащий поле для изменения. * @param смещенное смещение целочисленного поля в <code> obj </code>. * @param value Новое значение поля. * @see #putintvolatile (Object, long, int) */ public vaild void putorderedint (объект obj, long смещение, int value);
Измените позицию, в которой смещение объекта OBJ смещено до значения, потому что в Java нет операции памяти, и эта операция небезопасных просто дополняет недостаточную операцию памяти. Он также может быть использован для массивов, таких как concurrenthashmap для большого количества использования
Сегмент <K, V> S0 = новый сегмент <K, V> (LoadFactor, (int) (CAP * LoadFactor), (Hashentry <K, V> []) Новое Хашентрит [CAP]); Сегмент <K, v> [] ss = (сегмент <k, v> []) новый сегмент [ssize]; // Написать S0 в положение, где массив подписывается на 0: SS [0] = S0 небезопасно.putorderedObject (SS, SBASE, S0); // заказано написать сегменты [0]
Следует отметить, что OBJ должен быть установлен на нестабильный, в противном случае он будет невидимым для других потоков.
3 putxxxvolatile
/**** Устанавливает значение целочисленного поля в указанном смещении в* предоставленном объекте к данному значению, с семантикой нестабильной хранилища. * * @param obj объект, содержащий поле для изменения. * @param смещенное смещение целочисленного поля в <code> obj </code>. * @param value Новое значение поля. */ public vino void putintvolatile (объект obj, long offset, int value);
Он кажется таким же, как и Putorderint, потому что он должен быть установлен на нестабильный, иначе что такое использование?
Выше приведено все точки знаний, которые я поделился с вами на этот раз. Спасибо за поддержку Wulin.com.