Язык

ClassValue.Remove(Class) Метод

Определение

Удаляет связанное значение для данного класса.

[Android.Runtime.Register("remove", "(Ljava/lang/Class;)V", "GetRemove_Ljava_lang_Class_Handler", ApiSince=34)]
public virtual void Remove(Java.Lang.Class? type);
[<Android.Runtime.Register("remove", "(Ljava/lang/Class;)V", "GetRemove_Ljava_lang_Class_Handler", ApiSince=34)>]
abstract member Remove : Java.Lang.Class -> unit
override this.Remove : Java.Lang.Class -> unit

Параметры

type
Class

Тип, значение класса которого необходимо удалить

Атрибуты

Комментарии

Удаляет связанное значение для данного класса. Если это значение впоследствии #get читать для того же класса, его значение будет повторно инициализировано путем вызова метода #computeValue computeValue . Это может привести к дополнительному вызову computeValue метода для данного класса.

Чтобы объяснить взаимодействие между get и remove вызовами, необходимо моделировать переходы состояния значения класса, чтобы учитывать изменение между неинициализированными и инициализированными состояниями. Для этого число этих состояний последовательно от нуля и обратите внимание, что неинициализированные (или удаленные) состояния нумеруются с четными числами, а инициализированные (или повторно инициализированные) состояния имеют нечетные числа.

Когда поток T удаляет значение класса в состоянии 2N, ничего не происходит, так как значение класса уже неинициализировано. В противном случае состояние выполняется атомарным 2N+1образом.

Когда поток запрашивает значение класса в состоянииT, поток 2N сначала пытается инициализировать значение класса в состояние 2N+1 путем вызова computeValue и установки результирующего значения.

При T попытке установить только что вычисляемое значение, если состояние по-прежнему 2Nнаходится, значение класса будет инициализировано с вычисляемого значения, перемещая его в состояние 2N+1.

В противном случае, если новое состояние даже или нечетно, T будет удалено только что вычисляемое значение и повторите get операцию.

Отмена и повторная попытка является важным провизо, так как в противном случае T потенциально может установить катастрофически устаревшее значение. Например: <вызовы > ul<>liTCV.get(C) и отображает состояние2N< li>T быстро вычисляет значениеV0, зависящее от времени, и получает готовность к установке ли <>Tпопадает в ненужную разбиение по страницам или событие планирования, и переходит в спящий режим в течение длительного времени <li...> тем временем, также вызывает и видит состояниеT2CV.get(C) li2N< быстро вычисляет аналогичное значение>, зависящее от времени, и устанавливает его наT2V1 liCV.get(C)< (или третьем потоке), затем вызывает>, отмена T2работы CV.remove(C)liT2 предыдущих действий < повторяются несколько раз >лиT2, соответствующие вычисляемые значения изменяются с течением времени: <, , ... >V1V2<li>... между тем, T просыпается и пытается установитьV0; <Em>это должно завершиться ошибкой</em></ul>, мы можем предположить, что в приведенном выше сценарии CV.computeValue используется блокировка для правильного наблюдения за состояниями, зависящими от времени при вычисленииV1, и т. д. Это не удаляет угрозу устаревшего значения, так как между возвратом computeValue и T установкой нового значения существует период времени. В это время синхронизация пользователей невозможна.

Документация по Java для java.lang.ClassValue.remove(java.lang.Class<?>).

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

Применяется к