diff --git a/lectures/13-concurrency.lecture b/lectures/13-concurrency.lecture index a8c0185..0572f58 100644 --- a/lectures/13-concurrency.lecture +++ b/lectures/13-concurrency.lecture @@ -59,10 +59,10 @@ = Колко нишки ни трябват? * Колко нишки - pool size -* Определете коефицианта на блокиране - bc +* Определете коефициента на блокиране - bc * # нишки = # ядра / (1 - bc) * Определете частите, на които да разбиете задачата (partition size) -* Определeте зависимостите им +* Определете зависимостите им * И не на последно място - начина да си споделят памет ? @@ -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))))) @@ -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 @@ -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 когато можете @@ -140,6 +140,3 @@ Kласът Thread * Pure immutability - - -