Мова програмування Java і JVM (Java Virtual Machine) розроблені з підтримкою паралельних обчислень, і всі обчислення виконуються в контексті потоку. Декілька потоків можуть спільно використовувати об'єкти і ресурси; кожен потік може виконувати свої інструкції (код), але потенційно може отримати доступ до будь-якого об'єкта в програмі. В обов'язки програміста входить координація (або «синхронізація») потоків під час операції запису і читання розділюваних об'єктів. Синхронізація потоків потрібна для того, щоб гарантувати, що одночасно до одного об'єкту може звертатися тільки один потік, і щоб запобігти звернення потоків до неповністю оновлених об'єктів в той час, як з ними працює інший потік. В мові Java є вбудовані конструкції підтримки синхронізації потоків.
Процеси і потоки
Більшість реалізацій віртуальної машини Java використовують єдиний процес для виконання програми і в мові програмування Java поняття паралельних обчислень найчастіше пов'язують з потоками. Потоки іноді називають легкими процесами.
Об'єкти потоку
Потоки розділяють між собою ресурси процесора, а саме пам'ять і відкриті файли. Такий підхід веде до ефективної, але потенційно проблематичної, комунікації. Кожна програма має лише один потік, що виконується. Той потік з якого починає виконуватися програма, називається головним або основним. Головний потік здатний створювати додаткові потоки в вигляді об'єктів Runnable
або Callable
. (Інтерфейс Callable
схожий на Runnable
тим, що вони обоє розроблені для класів, екземпляри яких будуть виконуватися в окремому потоці. Але Runnable
не повертає результату і не може викинути (виняток, що перевіряється).)
Кожен потік може бути запланований для виконання на окремому ядрі ЦП, використовувати квантування часу на одноядерному процесорі або використовувати квантування часу на декількох процесорах. В двох останніх випадках система буде періодично переключатися між потоками, по черзі даючи виконуватися то одному, то іншому. Така схема називається псевдо-паралелізмом. Немає універсального рішення, яке сказало би як саме потоки Java будуть перетворені в нативні потоки ОС. Це залежить від конкретної реалізації JVM.
В мові Java потік представляється в вигляді об'єкту-потомка класу Thread
. Цей клас інкапсулює стандартні механізми роботи з потоком. Потоками можна управляти або напряму, або засобами абстрактних механізмів, таких як Executor і колекції з пакету java.util.concurrent.
Запуск потоку
Запустити новий потік можна двома способами:
- Реалізацією інтерфейсу Runnable
public class HelloRunnable implements Runnable { public void run() { System.out.println("Привіт з потоку!"); } public static void main(String[] args) { (new Thread(new HelloRunnable())).start(); } }
- Наслідуванням від класу Thread
public class HelloThread extends Thread { public void run() { System.out.println("Привіт з потоку!"); } public static void main(String[] args) { (new HelloThread()).start(); } }
Переривання
Переривання — вказівка потоку, що він має припинити поточну роботу і зробити ще щось. Потік може послати переривання викликом методу interrupt() в об'єкта Thread
, якщо потрібно перервати асоційований з ним потік. Механізм переривання реалізовано з використання внутрішньої мітки interrupt status (мітка переривання) класу Thread
. Виклик Thread.interrupt() активує цю мітку. Згідно з узгодженнями будь-який метод, який завершується викиданням InterruptedException скидає мітку переривання. Перевірити чи встановлена та чи інша мітка можна двома способами. Перший спосіб — викликати метод bool isInterrupted() об'єкту потоку, другий — викликати статичний метод bool Thread.interrupted(). Перший метод повертає стан мітки переривання і залишає цю мітку недоторканою. Другий метод повертає стан мітки і скидає її. Зауважте, що Thread.interrupted() - статичний метод класу Thread
, і його виклик повертає значення мітки переривання того потоку, з якого він був викликаний.
Очікування завершення
В Java передбачений механізм, який дозволяє одному потоку чекати виконання іншого. Для цього використовується метод Thread.join().
Демони
В Java процес завершується тоді, коли завершується останній його потік. Навіть коли метод main() вже завершився, але ще виконуються породжені ним потоки, система буде чекати їх завершення. Але це правило не відносить до особливого виду потоків — демонів. Якщо завершився останній звичайний потік процесу, і залишилися тільки потоки-демони, то вони будуть примусово завершені і виконання процесу закінчиться. Найчастіше потоки-демони використовуються для виконання фонових задач, які обслуговують процес протягом його життя.
Оголосити потік демоном досить просто - потрібно перед запуском потоку викликати його метод setDaemon(true); перевірити, чи є потік демоном, можна викликавши його метод boolean isDaemon().
Винятки
Викинутий і необроблений виняток веде до завершення потоку. Головний потік автоматично виведе виняток в консоль, а потоки, створені користувачем, можуть зробити це тільки зареєструвавши оброблювач.
Модель пам'яті
[1] описує взаємодію потоків через пам'ять в мові програмування Java. Найчастіше на сучасних комп'ютерах код заради швидкості виконується не в тому порядку, в якому він написаний. Перестановка виконується компілятором, процесором і підсистемою пам'яттю. Мова програмування Java не гарантує атомарність операцій і при читанні і записі полів розділюваних об'єктів. Дане рішення “розв'язує руки” компілятору і дозволяє проводити (такі як , і усунення зайвих операцій читання), основані на перестановці операцій доступу до пам'яті.
Синхронізація
Комунікація потоків здійснюється за допомогою поділу доступу до полів і об'єктів, на які посилаються поля. Дана форма комунікації є дуже ефективною, але створює можливість виникнення помилок двох різновидів: втручання в потік (thread interference) і помилки консистентності пам'яті (memory consistency errors). Для запобігання їх виникнення існує механізм синхронізації.
Перегрупування (зміна порядку проходження, reordering) проявляється в некоректно синхронізованих програмах, де один потік може спостерігати ефекти вироблені іншими потоками, і такі програми можуть бути в змозі виявити, що оновлені значення змінних стають видимими для інших потоків в порядку, відмінному від зазначеного в вихідному коді.
Для синхронізації потоків в Java використовуються монітори, які є високорівневим механізмом, що дозволяє одночасно тільки одному потоку виконувати блок коду, захищений монітором. Поведінка моніторів розглянута в термінах блокувань; з кожним об'єктом асоціюється одне блокування.
Синхронізація має кілька аспектів. Найбільш добре розуміється взаємне виключення (mutual exclusion) - тільки один потік може володіти монітором, таким чином синхронізація на моніторі означає, що як тільки один потік входить в synchronized-блок, захищений монітором, ніякий інший потік не може увійти в блок, захищений цим монітором поки перший потік не вийде з synchronized-блоку.
Але синхронізація - це більше ніж просто взаємне виключення. Синхронізація гарантує, що дані, записані в пам'ять до або всередині синхронізованого блоку, стають видимими для інших потоків, які синхронізуються на тому ж моніторі. Після того як ми виходимо з синхронізованого блоку, ми звільняємо (release) монітор, що має ефект скидання (flush) кешу в оперативну пам'ять, так що записи, зроблені нашим потоком, можуть бути видимими для інших потоків. Перш ніж ми зможемо увійти в синхронізований блок, ми захоплюємо (acquire) монітор, що має ефект оголошення недійсними даних локального процесорного кешу (invalidating the local processor cache), так що змінні будуть завантажені з основної пам'яті. Тоді ми зможемо побачити всі записи, зроблені видимими попереднім звільненням (release) монітора. (JSR 133)
Читання-запис в поле є атомарною операцією, якщо поле оголошено або захищене унікальним блокуванням, яке одержується перед будь-яким читанням-записом.
Блокування і synchonized-блоки
Ефект взаємного виключення і синхронізації потоків досягається входженням в synchronized-блок або метод, який неявно отримує блокування, або отриманням блокування явним чином (таким як ReentrantLock з пакету java.util.concurrent.locks). Обидва підходи мають однаковий вплив на поведінку пам'яті. Якщо всі спроби доступу до деякого полю захищені одним і тим самим блокуванням, то операції читання-запису цього поля є атомарними.
Volatile поля
Стосовно до полів ключове слово volatile
гарантує:
- (У всіх версіях Java) Доступи до
volatile
-змінної впорядковані глобально. Це означає, що кожен потік, який звертається доvolatile
-полю, прочитає його значення перед тим як продовжити замість того, щоб (по можливості) використовувати закешоване значення. (Доступи доvolatile
-змінної не можуть бути переупорядкувані один з одним, але вони можуть бути переупорядкувані з доступами до звичайних змінних. Це зводить нанівець корисністьvolatile
-полів як засобу передачі сигналу від одного потоку до іншого.) - (В Java 5 і пізніших) Запис в
volatile
-поле має той же ефект для пам'яті, що і звільнення монітора (англ. Monitor release), а читання - той же, що і захоплення (англ. Monitor acquire). Доступ доvolatile
-полів встановлює відношення «Виконується перед» (англ. happens before). По суті, це відношення є гарантією того, що все, що було очевидно для потокуA
, коли він писав вvolatile
-полеf
, стає видимим для потокуB
, коли він прочитаєf
.
Volatile
-поля є атомарними. Читання з volatile
-поля має той же ефект, що і отримання блокування: дані в робочій пам'яті оголошуються недійсними, значення volatile
-поля заново читається з пам'яті. Запис в volatile
-поле має той же ефект для пам'яті, що і звільнення блокування: volatile
-поле негайно записується в пам'ять.
Фінальні поля
Поле, яке оголошено final, називається фінальним і не може бути змінено після ініціалізації. Фінальні поля об'єкта ініціалізуютьтся в його конструкторі. Якщо конструктор відповідає певним простим правилам, то коректне значення фінального поля буде видимим для інших потоків без синхронізації. Просте правило: посилання this не повинне покинути конструктор до його завершення.
Історія
Починаючи з (JDK 1.2), в Java включений стандартний набір класів-колекцій .
, який також брав участь в реалізації Java Collections Framework, розробив concurrency, що включає в себе кілька примітивів синхронізації і велику кількість класів, що відносяться до колекцій. Робота над ним була продовжена як частина JSR 166 під головуванням Дага Лі. Реліз (JDK 5.0) включив багато доповнень і пояснень до моделі паралелізму в Java. Вперше API для роботи з паралелізмом розроблені JSR 166 були включені в JDK. надала підтримку для добре визначених атомарних операцій в багатопотоковому/багатопроцесорному оточенні. І (Java SE 6), і (Java SE 7) привносять зміни та доповнення в JSR 166 API.
Посилання
Посилання на зовнішні ресурси
- Java Memory Model and Thread Specification simplified Chinese edition
- Sun/Oracle Java Concurrency tutorial
- Java Multithreading Steeplechase
- JDK 5.0 concurrency utilities
- JavaOne 2005 — Concurrency Utilities in Practice
- JavaOne 2005 — Brian Goetz — Simpler, Faster, Better: Concurrency Utilities in JDK Software Version 5.0
- Podcast from JavaPosse — Interview with Brian Goetz on Concurrency in Java 5
- William Pugh’s Java Memory Model page
- Java Concurrency Tutorial by Jakob Jenkov
- Thread Safe Java Programming by Vadym Ustymenko
- Java Concurrency Animations by Victor Grazi
- LiterateJava.com — Silent Thread death from unhandled exceptions
- Synchronization and Thread Safety in Java
Примітки
- Herlihy, Maurice, and Nir Shavit. «The art of multiprocessor programming.» PODC. Vol. 6. 2006.
- Section 17.4.4: Synchronization Order |title=The Java® Language Specification, Java SE 7 Edition . Oracle Corporation. 2013 http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.4. Процитовано 12 травня 2013.
{{}}
: Пропущений або порожній|title=
() - . Overview of package util.concurrent Release 1.3.4. Процитовано 1 січня 2011.
Note: Upon release of J2SE 5.0, this package enters maintenance mode: Only essential corrections will be released. J2SE5 package java.util.concurrent includes improved, more efficient, standardized versions of the main components in this package.
- . Архів оригіналу за 3 листопада 2016. Процитовано 3 листопада 2016.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Mova programuvannya Java i JVM Java Virtual Machine rozrobleni z pidtrimkoyu paralelnih obchislen i vsi obchislennya vikonuyutsya v konteksti potoku Dekilka potokiv mozhut spilno vikoristovuvati ob yekti i resursi kozhen potik mozhe vikonuvati svoyi instrukciyi kod ale potencijno mozhe otrimati dostup do bud yakogo ob yekta v programi V obov yazki programista vhodit koordinaciya abo sinhronizaciya potokiv pid chas operaciyi zapisu i chitannya rozdilyuvanih ob yektiv Sinhronizaciya potokiv potribna dlya togo shob garantuvati sho odnochasno do odnogo ob yektu mozhe zvertatisya tilki odin potik i shob zapobigti zvernennya potokiv do nepovnistyu onovlenih ob yektiv v toj chas yak z nimi pracyuye inshij potik V movi Java ye vbudovani konstrukciyi pidtrimki sinhronizaciyi potokiv Procesi i potokiBilshist realizacij virtualnoyi mashini Java vikoristovuyut yedinij proces dlya vikonannya programi i v movi programuvannya Java ponyattya paralelnih obchislen najchastishe pov yazuyut z potokami Potoki inodi nazivayut legkimi procesami Ob yekti potoku Potoki rozdilyayut mizh soboyu resursi procesora a same pam yat i vidkriti fajli Takij pidhid vede do efektivnoyi ale potencijno problematichnoyi komunikaciyi Kozhna programa maye lishe odin potik sho vikonuyetsya Toj potik z yakogo pochinaye vikonuvatisya programa nazivayetsya golovnim abo osnovnim Golovnij potik zdatnij stvoryuvati dodatkovi potoki v viglyadi ob yektiv Runnable abo Callable Interfejs Callable shozhij na Runnable tim sho voni oboye rozrobleni dlya klasiv ekzemplyari yakih budut vikonuvatisya v okremomu potoci Ale Runnable ne povertaye rezultatu i ne mozhe vikinuti vinyatok sho pereviryayetsya Kozhen potik mozhe buti zaplanovanij dlya vikonannya na okremomu yadri CP vikoristovuvati kvantuvannya chasu na odnoyadernomu procesori abo vikoristovuvati kvantuvannya chasu na dekilkoh procesorah V dvoh ostannih vipadkah sistema bude periodichno pereklyuchatisya mizh potokami po cherzi dayuchi vikonuvatisya to odnomu to inshomu Taka shema nazivayetsya psevdo paralelizmom Nemaye universalnogo rishennya yake skazalo bi yak same potoki Java budut peretvoreni v nativni potoki OS Ce zalezhit vid konkretnoyi realizaciyi JVM V movi Java potik predstavlyayetsya v viglyadi ob yektu potomka klasu Thread Cej klas inkapsulyuye standartni mehanizmi roboti z potokom Potokami mozhna upravlyati abo napryamu abo zasobami abstraktnih mehanizmiv takih yak Executor i kolekciyi z paketu java util concurrent Zapusk potoku Zapustiti novij potik mozhna dvoma sposobami Realizaciyeyu interfejsu Runnable public class HelloRunnable implements Runnable public void run System out println Privit z potoku public static void main String args new Thread new HelloRunnable start Nasliduvannyam vid klasu Thread public class HelloThread extends Thread public void run System out println Privit z potoku public static void main String args new HelloThread start Pererivannya Pererivannya vkazivka potoku sho vin maye pripiniti potochnu robotu i zrobiti she shos Potik mozhe poslati pererivannya viklikom metodu interrupt v ob yekta Thread yaksho potribno perervati asocijovanij z nim potik Mehanizm pererivannya realizovano z vikoristannya vnutrishnoyi mitki interrupt status mitka pererivannya klasu Thread Viklik Thread interrupt aktivuye cyu mitku Zgidno z uzgodzhennyami bud yakij metod yakij zavershuyetsya vikidannyam InterruptedException skidaye mitku pererivannya Pereviriti chi vstanovlena ta chi insha mitka mozhna dvoma sposobami Pershij sposib viklikati metod bool isInterrupted ob yektu potoku drugij viklikati statichnij metod bool Thread interrupted Pershij metod povertaye stan mitki pererivannya i zalishaye cyu mitku nedotorkanoyu Drugij metod povertaye stan mitki i skidaye yiyi Zauvazhte sho Thread interrupted statichnij metod klasu Thread i jogo viklik povertaye znachennya mitki pererivannya togo potoku z yakogo vin buv viklikanij Ochikuvannya zavershennya V Java peredbachenij mehanizm yakij dozvolyaye odnomu potoku chekati vikonannya inshogo Dlya cogo vikoristovuyetsya metod Thread join Demoni V Java proces zavershuyetsya todi koli zavershuyetsya ostannij jogo potik Navit koli metod main vzhe zavershivsya ale she vikonuyutsya porodzheni nim potoki sistema bude chekati yih zavershennya Ale ce pravilo ne vidnosit do osoblivogo vidu potokiv demoniv Yaksho zavershivsya ostannij zvichajnij potik procesu i zalishilisya tilki potoki demoni to voni budut primusovo zaversheni i vikonannya procesu zakinchitsya Najchastishe potoki demoni vikoristovuyutsya dlya vikonannya fonovih zadach yaki obslugovuyut proces protyagom jogo zhittya Ogolositi potik demonom dosit prosto potribno pered zapuskom potoku viklikati jogo metod setDaemon true pereviriti chi ye potik demonom mozhna viklikavshi jogo metod boolean isDaemon Vinyatki Vikinutij i neobroblenij vinyatok vede do zavershennya potoku Golovnij potik avtomatichno vivede vinyatok v konsol a potoki stvoreni koristuvachem mozhut zrobiti ce tilki zareyestruvavshi obroblyuvach Model pam yati 1 opisuye vzayemodiyu potokiv cherez pam yat v movi programuvannya Java Najchastishe na suchasnih komp yuterah kod zaradi shvidkosti vikonuyetsya ne v tomu poryadku v yakomu vin napisanij Perestanovka vikonuyetsya kompilyatorom procesorom i pidsistemoyu pam yattyu Mova programuvannya Java ne garantuye atomarnist operacij i pri chitanni i zapisi poliv rozdilyuvanih ob yektiv Dane rishennya rozv yazuye ruki kompilyatoru i dozvolyaye provoditi taki yak i usunennya zajvih operacij chitannya osnovani na perestanovci operacij dostupu do pam yati Sinhronizaciya Komunikaciya potokiv zdijsnyuyetsya za dopomogoyu podilu dostupu do poliv i ob yektiv na yaki posilayutsya polya Dana forma komunikaciyi ye duzhe efektivnoyu ale stvoryuye mozhlivist viniknennya pomilok dvoh riznovidiv vtruchannya v potik thread interference i pomilki konsistentnosti pam yati memory consistency errors Dlya zapobigannya yih viniknennya isnuye mehanizm sinhronizaciyi Peregrupuvannya zmina poryadku prohodzhennya reordering proyavlyayetsya v nekorektno sinhronizovanih programah de odin potik mozhe sposterigati efekti virobleni inshimi potokami i taki programi mozhut buti v zmozi viyaviti sho onovleni znachennya zminnih stayut vidimimi dlya inshih potokiv v poryadku vidminnomu vid zaznachenogo v vihidnomu kodi Dlya sinhronizaciyi potokiv v Java vikoristovuyutsya monitori yaki ye visokorivnevim mehanizmom sho dozvolyaye odnochasno tilki odnomu potoku vikonuvati blok kodu zahishenij monitorom Povedinka monitoriv rozglyanuta v terminah blokuvan z kozhnim ob yektom asociyuyetsya odne blokuvannya Sinhronizaciya maye kilka aspektiv Najbilsh dobre rozumiyetsya vzayemne viklyuchennya mutual exclusion tilki odin potik mozhe voloditi monitorom takim chinom sinhronizaciya na monitori oznachaye sho yak tilki odin potik vhodit v synchronized blok zahishenij monitorom niyakij inshij potik ne mozhe uvijti v blok zahishenij cim monitorom poki pershij potik ne vijde z synchronized bloku Ale sinhronizaciya ce bilshe nizh prosto vzayemne viklyuchennya Sinhronizaciya garantuye sho dani zapisani v pam yat do abo vseredini sinhronizovanogo bloku stayut vidimimi dlya inshih potokiv yaki sinhronizuyutsya na tomu zh monitori Pislya togo yak mi vihodimo z sinhronizovanogo bloku mi zvilnyayemo release monitor sho maye efekt skidannya flush keshu v operativnu pam yat tak sho zapisi zrobleni nashim potokom mozhut buti vidimimi dlya inshih potokiv Persh nizh mi zmozhemo uvijti v sinhronizovanij blok mi zahoplyuyemo acquire monitor sho maye efekt ogoloshennya nedijsnimi danih lokalnogo procesornogo keshu invalidating the local processor cache tak sho zminni budut zavantazheni z osnovnoyi pam yati Todi mi zmozhemo pobachiti vsi zapisi zrobleni vidimimi poperednim zvilnennyam release monitora JSR 133 Chitannya zapis v pole ye atomarnoyu operaciyeyu yaksho pole ogolosheno abo zahishene unikalnim blokuvannyam yake oderzhuyetsya pered bud yakim chitannyam zapisom Blokuvannya i synchonized bloki Efekt vzayemnogo viklyuchennya i sinhronizaciyi potokiv dosyagayetsya vhodzhennyam v synchronized blok abo metod yakij neyavno otrimuye blokuvannya abo otrimannyam blokuvannya yavnim chinom takim yak ReentrantLock z paketu java util concurrent locks Obidva pidhodi mayut odnakovij vpliv na povedinku pam yati Yaksho vsi sprobi dostupu do deyakogo polyu zahisheni odnim i tim samim blokuvannyam to operaciyi chitannya zapisu cogo polya ye atomarnimi Volatile polya Stosovno do poliv klyuchove slovo volatile garantuye U vsih versiyah Java Dostupi do volatile zminnoyi vporyadkovani globalno Ce oznachaye sho kozhen potik yakij zvertayetsya do volatile polyu prochitaye jogo znachennya pered tim yak prodovzhiti zamist togo shob po mozhlivosti vikoristovuvati zakeshovane znachennya Dostupi do volatile zminnoyi ne mozhut buti pereuporyadkuvani odin z odnim ale voni mozhut buti pereuporyadkuvani z dostupami do zvichajnih zminnih Ce zvodit nanivec korisnist volatile poliv yak zasobu peredachi signalu vid odnogo potoku do inshogo V Java 5 i piznishih Zapis v volatile pole maye toj zhe efekt dlya pam yati sho i zvilnennya monitora angl Monitor release a chitannya toj zhe sho i zahoplennya angl Monitor acquire Dostup do volatile poliv vstanovlyuye vidnoshennya Vikonuyetsya pered angl happens before Po suti ce vidnoshennya ye garantiyeyu togo sho vse sho bulo ochevidno dlya potoku A koli vin pisav v volatile pole f staye vidimim dlya potoku B koli vin prochitaye f Volatile polya ye atomarnimi Chitannya z volatile polya maye toj zhe efekt sho i otrimannya blokuvannya dani v robochij pam yati ogoloshuyutsya nedijsnimi znachennya volatile polya zanovo chitayetsya z pam yati Zapis v volatile pole maye toj zhe efekt dlya pam yati sho i zvilnennya blokuvannya volatile pole negajno zapisuyetsya v pam yat Finalni polya Pole yake ogolosheno final nazivayetsya finalnim i ne mozhe buti zmineno pislya inicializaciyi Finalni polya ob yekta inicializuyuttsya v jogo konstruktori Yaksho konstruktor vidpovidaye pevnim prostim pravilam to korektne znachennya finalnogo polya bude vidimim dlya inshih potokiv bez sinhronizaciyi Proste pravilo posilannya this ne povinne pokinuti konstruktor do jogo zavershennya IstoriyaPochinayuchi z JDK 1 2 v Java vklyuchenij standartnij nabir klasiv kolekcij yakij takozh brav uchast v realizaciyi Java Collections Framework rozrobiv concurrency sho vklyuchaye v sebe kilka primitiviv sinhronizaciyi i veliku kilkist klasiv sho vidnosyatsya do kolekcij Robota nad nim bula prodovzhena yak chastina JSR 166 pid golovuvannyam Daga Li Reliz JDK 5 0 vklyuchiv bagato dopovnen i poyasnen do modeli paralelizmu v Java Vpershe API dlya roboti z paralelizmom rozrobleni JSR 166 buli vklyucheni v JDK nadala pidtrimku dlya dobre viznachenih atomarnih operacij v bagatopotokovomu bagatoprocesornomu otochenni I Java SE 6 i Java SE 7 privnosyat zmini ta dopovnennya v JSR 166 API PosilannyaGoetz Brian Joshua Bloch Joseph Bowbeer Doug Lea David Holmes Tim Peierls 2006 Java Concurrency in Practice Addison Wesley ISBN 0 321 34960 1 Lea Doug 1999 Concurrent Programming in Java Design Principles and Patterns Addison Wesley ISBN 0 201 31009 0 Posilannya na zovnishni resursiJava Memory Model and Thread Specification simplified Chinese edition Sun Oracle Java Concurrency tutorial Java Multithreading Steeplechase JDK 5 0 concurrency utilities JavaOne 2005 Concurrency Utilities in Practice JavaOne 2005 Brian Goetz Simpler Faster Better Concurrency Utilities in JDK Software Version 5 0 Podcast from JavaPosse Interview with Brian Goetz on Concurrency in Java 5 William Pugh s Java Memory Model page Java Concurrency Tutorial by Jakob Jenkov Thread Safe Java Programming by Vadym Ustymenko Java Concurrency Animations by Victor Grazi LiterateJava com Silent Thread death from unhandled exceptions Synchronization and Thread Safety in JavaPrimitkiHerlihy Maurice and Nir Shavit The art of multiprocessor programming PODC Vol 6 2006 Section 17 4 4 Synchronization Order title The Java Language Specification Java SE 7 Edition Oracle Corporation 2013 http docs oracle com javase specs jls se7 html jls 17 html jls 17 4 4 Procitovano 12 travnya 2013 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Propushenij abo porozhnij title dovidka Overview of package util concurrent Release 1 3 4 Procitovano 1 sichnya 2011 Note Upon release of J2SE 5 0 this package enters maintenance mode Only essential corrections will be released J2SE5 package java util concurrent includes improved more efficient standardized versions of the main components in this package Arhiv originalu za 3 listopada 2016 Procitovano 3 listopada 2016