singalen: (Default)
[personal profile] singalen
Как я провёл лето прочёл Lea.

С вопроса "Что нового узнал" начинается настоящий конспект %)

Глава 1.1 Using Concurrency Constructs


Новое:
Чётко сформулированы термины параллельности. Их много: в постановке задачи,
в проблематике, в решениях.
Перечисляю:
Exclusion, state dependance,

Три принципа:
Always lock during updates to object fields.
Always lock during access of possibly updated object fields.
Never lock when invoking methods on other objects.

тоже порадовали своей простотой и неполнотой :)
Смутно чувствую, что здесь должна быть более сложная модель, охватывающая гораздо больший диапазон частных случаев - с приватными переменными, thread-specific переменными, и те де, и те пе.

Интересно было почитать о средствах языка, широко применяеммых в параллельном программировании, в частности о слве final. Наверное, есть что-то ещё?
UnmodifiableCollection?

Inner classes are convenient and useful is that they capture all appropriate context variables - here p and canvas - without the need to create a separate class with fields that record these values. This convenience comes at the price of one minor awkwardness: All captured method arguments and local variables must be declared as final, as a guarantee that the values can indeed be captured unambiguously.

yield() может быть описан как no-op.

Оказывается, вот для чего нужна ThreadGroup - для разделения доступа треда к треду.

Много ссылок на хорошую литературу, читанную и нечитанную.

Глава 1.2. Objects and Concurrency


Чётко перечислены и описаны накладные расходы параллельности: Sharing, Scheduling, Communication.

Оказывается, на Java можно создавать lighter-weight frameworks, если перечисленные свойства Thread становятся проблемой для производительности. Интересно, как.

Первым параллельным языком была Simula.

Я неправильно перевожу "конкурентный" как "параллельный". Параллельный - это когда каждая задача выполняется на своём процессоре и процессы общаются только через сообщения. А конкурентный - это со всеми прелестями именно что конкурентного доступа к переменным, race conditions.

Глава 1.3 Design Forces


Новое:
Выражение конкурентной системы в противостоянии Инь и Ян... то есть:
Safety. Nothing bad ever happens to an object.
Liveness. Something eventually happens within an activity.

Другие имена великих начал -
Reusability. The utility of objects and classes across multiple contexts.
Performance. The extent to which activities execute soon and quickly.

Далее конкурентное программирование рассматривается с точки зрения Дао... то есть этих аспектов.

Наконец точно узнал, чем чреваты пресловутые race conditions.
Это так-таки всего-навсего два конфликта: есть контакт там, где его не должно быть, и нет контакта там, где он есть Read-Write и Write-Write conflicts (причём, я думаю, Write без предыдущего Read не бывает).

Как часть возможной модели, вводятся варианты атрибутов:
- непосредственное значение;
- кэшированное значение;
- булевское значение, управляющее логикой кода;
- состояние процесса выполнения;
- история предыдущих состояний;
- версия (таймстамп);
- ссылки на объекты, с которым объект общается, но которыми не владеет;
(кстати, кто предложит атрибут, не укладывающийся в эту модель?)

Классификация ошибок/проблем конкурентности.
- locking & waiting, input (проблема ли это?), CPU contention (никогда-не-получение тредом ЦПУ), перманентная thread failure, deadlocks, и nested monitor lockouts (чем они различаются?), missed signals, livelock (вариант дедлока, когда попытки залочить не ждут, а крутятся в цикле), starvation (чем не CPU contention?), resource exhaustion, distributed failure.

Очень хорошая подборка критериев производительности, которая может в какой-то степени ответить на вопрос Сергея о том, как вообще мерить производительность распределённой (т.е. тоже конкурентной/параллельной) системы (за расшифровкой см. книгу ;):
- Throughput;
- Latency;
- Capacity;
- (Resource) Efficiancy;
- Scalability;
- Degradation;

И причины её падения:
- Locks;
- Monitors;
- Threads;
- Context-switching;
- Scheduling;
- Locality;
- Algorithmics.

Подняты проблемы повторного использования. Повторное использование компоненты, даже тред-безопасной самой по себе, может приводить к проблемам с тредами.
Вот ведь как.
Особое внимание в свете конкурентности уделяется инкапсуляции (Restricted external communication) и консистентности (Deterministic internal structure).

В секции "Документирование" подчёркивается важность инвариантов.

1.4 Before/After Patterns


Пошло непонятное.

"The fields of any object should preserve all invariants whenever the object is not engaged in a public method"
Но откуда это следует - именно public? Что, в private нельзя записать последовательно в два поля, не лоча их, а в public можно? Ссылка на секцию 1.3.1, "Safety" вопроса не прояснила. Или наоборот, именно публичные методы так-таки обязаны сохранять инварианты только в начале и конце, а остальные не обязаны? (Это более вероятно)

В чём важность именно before/after проверок инвариантов - такая, что ей нужно было посвятить целую главу?
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting