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