Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 12 additions & 15 deletions lectures/13-concurrency.lecture
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@
= Колко нишки ни трябват?

* Колко нишки - pool size
* Определете коефицианта на блокиране - bc
* Определете коефициента на блокиране - bc
* # нишки = # ядра / (1 - bc)
* Определете частите, на които да разбиете задачата (partition size)
* Определeте зависимостите им
* Определете зависимостите им
* И не на последно място - начина да си споделят памет ?


Expand All @@ -71,12 +71,12 @@

Интерфейса Runnable
Функциите в Clojure са Runnable
Kласът Thread
Класът Thread
- имплементира Runnable
- може да се създаде, като приема Runnable обект за аргумент
- пускате нишка чрез метода start()
- ще разгледаме пълния живот на една нишка в следващите слайдове
- класът Thread има и статични методи които позволяват да вземете информация за текущото изпълнение, брой нишки, stackTrace и тн.
- класът Thread има и статични методи които позволяват да вземете информация за текущото изпълнение, брой нишки, stackTrace и т.н.

:code
(dotimes [i 10] (.start (Thread. (fn [] (println i)))))
Expand All @@ -89,16 +89,16 @@ Kласът Thread

* Стандартно нишките не могат да се преизползват
* Работата с wait и notify е сложна и често се правят грешки
* Гранулярността на синхронизиране е много трудна
* Няма как да се сложат time-out на syncronized
* Syncronized не позволява синхронно четене
* Грануларността на синхронизиране е много трудна
* Няма как да се сложат time-out на synchronized
* Synchronized не позволява синхронно четене
* Тестването е сложно и изисква прекалено много код

= Как да ползваме новото API за конкурентност

* ExecutorService е тук, за да замени методите на Thread класа
* Когато ви трябват ключалки, ползвайте Lock интерфейса
* Когато ви трябват wait/notify, ползвайте CyclicBarries или CountdownLatch
* Когато ви трябват wait/notify, ползвайте CyclicBarriers или CountdownLatch

= Споделяне на ресурси
== The fun starts here
Expand All @@ -115,20 +115,20 @@ Kласът Thread
= Възможни проблеми в работата с нишки
== Race conditions

* Конкурентно използване на ресурси (където поне едната нишкa модифицира състоянието)
* Конкурентно използване на ресурси (където поне едната нишка модифицира състоянието)
* Just-in-time compiler optimization
* Java Memory Model
* Некоректно използване на syncronized
* Некоректно използване на synchronized

= Какво да правим?

* Винаги слагайте time-out когато чакате за ресурси / събития
* Винаги освобождавайте споделени ресурси след определен time-out
* Сложете ясен ред и приоритет на ползването на ресурсите
* Синхронизирайте гранулярно, но пълно!
* Синхронизирайте грануларно, но пълно!
* Ползвайте volatile за да избегнете JIC оптимизации

* Ако ще влизате в дебрите на конкурентността - отделете времето да разберете модела на паметта на Java, the Memory Barier, компилацията и тн
* Ако ще влизате в дебрите на конкурентността - отделете времето да разберете модела на паметта на Java, the Memory Barrier, компилацията и т.н.

* И все пак - избягвайте споделен mutable state когато можете

Expand All @@ -140,6 +140,3 @@ Kласът Thread

* Pure immutability