|
Spec-Zone .ru
спецификации, руководства, описания, API
|
public abstract class ClassValue<T> extends Object
ClassValue к кэшу информация должна была выполнить сообщение, передаются быстро, для каждого class, с которым встречаются.| Модификатор | Конструктор и Описание |
|---|---|
protected |
ClassValue()
Единственный конструктор.
|
| Модификатор и Тип | Метод и Описание |
|---|---|
protected abstract T |
computeValue(Class<?> type)
Вычисляет сделанную ставку данного class для этого
ClassValue. |
T |
get(Class<?> type)
Возвращает значение для данного class.
|
void |
remove(Class<?> type)
Удаляет присваиваемое значение для данного class.
|
protected ClassValue()
protected abstract T computeValue(Class<?> type)
ClassValue. Этот метод будет вызван в пределах первого потока, который получает доступ к значению с get метод.
Обычно, этот метод вызывается самое большее однажды на class, но это может быть вызвано снова, если был звонок remove.
Если этот метод выдает исключение, соответствующий звонок get завершится неправильно с тем исключением, и никакое значение class не будет записано.
type - тип, значение class которого должно быть вычисленоClassValue, для данного class или интерфейсаget(java.lang.Class<?>), remove(java.lang.Class<?>)public T get(Class<?> type)
computeValue метод. Фактическая установка значения на class выполняется атомарно. В той точке, если несколько мчащихся потоков вычислили значения, каждый выбирается, и возвращается ко всем мчащимся потокам.
type параметром обычно является class, но это может быть любой тип, такой как интерфейс, тип примитива (как int.class), или void.class.
В отсутствие remove вызовы, у значения class есть простая диаграмма состояний: неинициализированный и инициализированный. Когда remove вызовы выполняются, правила для наблюдения значения более сложны. См. документацию для remove для получения дополнительной информации.
type - тип, значение class которого должно быть вычислено или полученоClassValue, для данного class или интерфейсаNullPointerException - если параметром является нульremove(java.lang.Class<?>), computeValue(java.lang.Class<?>)public void remove(Class<?> type)
computeValue метод. Это может привести к дополнительному вызову computeValue метод для данного class. Чтобы объяснить взаимодействие между get и remove вызовы, мы должны смоделировать изменения состояния значения class, чтобы принять во внимание чередование между неинициализированными и инициализированными состояниями. Чтобы сделать это, пронумеруйте эти состояния последовательно от нуля, и отметьте, что неинициализированный (или удаленный) состояния нумеруются с четными числами, в то время как инициализировано (или повторно инициализировал), у состояний есть нечетные числа.
Когда поток T удаляет значение class в состоянии 2N, ничто не происходит, так как значение class является уже неинициализированным. Иначе, состояние совершенствуется атомарно к 2N+1.
Когда поток T запрашивает значение class в состоянии 2N, поток сначала пытается инициализировать значение class, чтобы утвердить 2N+1 вызывая computeValue и установка получающегося значения.
Когда T попытки установить недавно вычисленное значение, если состояние все еще в 2N, значение class будет инициализировано с вычисленным значением, совершенствуя это, чтобы утвердить 2N+1.
Иначе, ли новое состояние даже или нечетно, T отбросит недавно вычисленное значение и повторит get работа.
Отбрасывание и повторение являются важным условием, с тех пор иначе T мог потенциально установить пагубно устарелое значение. Например:
T вызовы CV.get(C) и видит состояние 2N
T быстро вычисляет значение с временной зависимостью V0 и готовится устанавливать это T поражается неудачным событием оповещения или планирования, и засыпает в течение долгого времени T2 также вызовы CV.get(C) и видит состояние 2N
T2 быстро вычисляет подобное значение с временной зависимостью V1 и установки это на CV.get(C)
T2 (или третий поток), тогда вызывает CV.remove(C), отмена T2's работа T2 повторяются несколько раз V1, V2, ... T просыпается и пытается установить V0; это должно перестать работать
CV.computeValue использование блокирует, чтобы должным образом наблюдать состояния с временной зависимостью, как это вычисляет V1, и т.д.. Это не удаляет угрозу устарелого значения, так как есть окно времени между возвратом computeValue в T и установка новое значение. Никакая пользовательская синхронизация не возможна в это время.type - тип, значение class которого должно быть удаленоNullPointerException - если параметром является нуль
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92