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 и/или его филиалы. Все права защищены.