Najvredniji vodič za učenje Java konkurentnog programiranja za 2026. (🔥)
Poznato je da je Java konkurentnost oblast koju Java programer mora razumeti, a koja je teška za razumevanje. Generalno, retko ko se usudi da kaže da vlada Java konkurentnošću: prvo, lako ga intervjueri poraze; drugo, konkurentno programiranje dodiruje jezgro računarstva — operativne sisteme, memoriju, CPU — i prilično iskušava unutrašnje znanje programera.
Današnji članak daje pregled kako od početnika do majstora savladati Java konkurentnost — pravo vreme da otrešete prašinu sa fascikle za čuvanje. Ako vam tokom čitanja bude od koristi, molim vas da ga sačuvate i prosledite — to je malo ohrabrenje za moje uporno kucanje.
1. Zašto učiti Java konkurentnost?
Rečenica koju ne znam da li da kažem — ali ipak ću je reći: „Ako želiš samo da radiš CRUD, Java konkurentnost ne moraš ni da učiš!” Ali u stvari, svi su već dobro naučeni lepom ponašanju; nije važno da li na poslu zavijaš šrafove, važno je da na intervjuu umete da napravite raketu, inače je teško i doći do prilike za razgovor.
Pa, kao vrlo važna karika u Java sistemu, Java konkurentnost se prirodno mora savladati — bar umeti da pokrenete više niti, zar ne? Ha ha. Na višem nivou, Tomcat server, middleware za poruke, RPC okviri i sl., koje koristimo u svakodnevnom razvoju, sve na niskom nivou dodiruju konkurentno programiranje.
Naravno, Java konkurentnost zaista obuhvata mnogo toga: znanja o operativnim sistemima, Java virtuelnoj mašini, modelu Java niti, ključnim rečima vezanim za višenitnost, recimo synchronized, volatile i sl., zatim znanja o bravama, JDK alatkama i sl.; učenje lako može da zaboli glava.
Zato su nam potrebni efikasni vodiči za učenje i kvalitetni resursi, kako bismo smanjili vreme i energiju uložene u učenje Java konkurentnog programiranja.
2. Vodič za učenje Java konkurentnosti
Ovo je mapa uma o Java konkurentnom programiranju koju sam nedavno sastavio; glavni pravci se dele na tri dela: osnove niti, teorijske osnove i alatke JUC.

Osnove niti obuhvataju:
- Načini kreiranja niti
- Promena stanja niti
- Osnovne operacije nad nitima
- Grupe niti i prioriteti niti
Teorijske osnove obuhvataju:
- Razlika između procesa i niti
- Koji problem rešava višenitnost, a koje probleme donosi?
- Kako rešiti probleme konkurentnosti? Obuhvata Java model memorije i dve uobičajene ključne reči: volatile i synchronized
Alatke JUC obuhvataju:
- Brave Lock: AQS, ReentrantLock, ReentrantReadWriteLock, Condition, LockSupport
- Konkurentni kontejneri: ConcurrentHashMap, ConcurrentLinkedQueue, CopyOnWriteArrayList, ThreadLocal, BlockingQueue
- Pool niti: ThreadPoolExecutor, ScheduledThreadPoolExecutor
- Atomike: AtomicInteger, AtomicIntegerArray, AtomicReference itd.
- Alatke za komunikaciju: brojač odbrojavanja CountDownLatch, ciklična barijera CyclicBarrier, kontrola pristupa resursima Semaphore, razmena podataka Exchanger, fazer Phaser
- Fork/Join okvir
Na kraju, uz klasičan obrazac proizvođač-potrošač za praksu, čitav Java sistem konkurentnosti se uči veoma čvrsto!
3. Čvrsti resursi za učenje Java konkurentnosti
1) Ergeov put ka naprednoj Javi
Kada učiš Javu, naravno da tražiš „Ergeov put ka naprednoj Javi”; adresu ostavljam ispod:
Uđite i pravo tražite Java konkurentno programiranje. Prema gornjoj mapi uma sastavio sam 31 članak, sve na čvrstom nivou — samo pratite i učite.

2) Video
Ko zna, taj zna — za video ideš na Bilibili. Heima-in „Java konkurentno programiranje” ima dobre ocene, sa preko 300 pododeljaka; mislim da su tri dela dobro obrađena: princip optimizacije synchronized, AQS i pool niti.

Adresa videa: https://www.bilibili.com/video/BV16J411h7Rd
Još i ovaj video koji predaje profesor Song Hongkang iz SGG-a.

Adresa videa: https://www.bilibili.com/video/BV1Kw411Z7dF/
3) Knjige
Od štampanih knjiga preporučujem samo jednu — „Java Concurrency in Practice”, sa ocenom 9,0 na Doubanu. Ipak, knjiga je zaista pomalo stara, u suštini se oslanja na Javu 6; nadam se da će izdavač na vreme izdati verziju 2.0.

Gledano u celini, knjiga „Java Concurrency in Practice” ima dve glavne linije:
- Predstavlja ključne komponente i principe Java konkurentnog paketa
- Kako iskoristiti te komponente da bi se osigurala bezbednost niti
Kako zapravo postići bezbednost niti? Naučite i razumite sledeći pasus:
Writing thread-safe code is, at its core, about managing access to state, and in particular to shared, mutable state.
Ako vam se učini teško razumljivim i želite da krenete od domaćih autora, možete probati „Umetnost Java konkurentnog programiranja” i „Java konkurentno programiranje ilustrovano”; iako su im ocene na Doubanu prosečne, za izgradnju sistema znanja o Java konkurentnosti od velike su pomoći.
Zatim, kada se latite „Java Concurrency in Practice”, osetićete da više nije tako naporno kao ranije; knjiga se sa razlogom smatra biblijom Java konkurentnog programiranja i zaista se vidi da autor ima bogato iskustvo u konkurentnom programiranju.
4) Open-source e-knjige
Preporučujem „Duboko i pristupačno: Java višenitnost” iz RedSpider zajednice — razumljiviji od „Java Concurrency in Practice”, jer je prožet mnogim lepim ručno nacrtanim slikama.

GitHub adresa: https://github.com/RedSpider1/concurrent
S obzirom na to da nekim čitaocima možda treba PDF verzija, potrošio sam nedelju dana da je pripremim.
Još preporučujem jedan pregled znanja o Java konkurentnosti sa 3,6k+ zvezdica na GitHub-u:
U repozitorijumu postoji jedna rečenica koja mi se jako sviđa i koju delim sa vama:
Smisao truda je u tome što, u danima koji dolaze, gledajući unaokolo, vidite samo ljude i stvari koje volite!
5) Napredni resursi
Objavljeno je i „Prvo izdanje PDF-a Ergeovog puta ka naprednom konkurentnom programiranju”, koje obuhvata osnovne koncepte niti i način upotrebe, model memorije Jave, synchronized, volatile, CAS, AQS, ReentrantLock, pool niti, konkurentne kontejnere, ThreadLocal, model proizvođač-potrošač i drugu znanja neophodna za intervju i razvoj — ukupno preko 150 hiljada reči i 200+ ručno nacrtanih slika, razumljivo i sa humorom... Detalje pogledajte: „Ergeov put ka naprednom konkurentnom programiranju — PDF”.

Wang Baoling je na platformi GeekTime otvorio kurs „Java konkurentno programiranje u praksi” — kvalitet je prilično visok; ko želi može ga pogledati na toj platformi.
4. Kvalitetna pitanja za intervju
Ovde preporučujem dve zbirke pitanja za intervju o Java konkurentnom programiranju: jedna je obrtanje tabela iz San Fen E-a, a druga je od Xiao Niua. Prvo jedan snimak da vidite koja su to visokofrekventna pitanja na intervjuima o Java konkurentnosti.

Da bi vam bilo lakše da čitate i pamtite, već sam ih preuredio na sajt „Ergeov put ka naprednoj Javi”, obrtanje tabela — Java konkurentnost:
Pitanja o Java konkurentnom programiranju (verzija za pamćenje):
Kvalitet obe zbirke pitanja je veoma visok; pogledajte sadržaj pododeljka „Koliko znate o AQS-u” — bogato ilustrovan i veoma lako se svari.

Iskreno — ako naučite ove dve zbirke pitanja, zaista možete na CV napisati da „vladate” Java konkurentnošću.
5. Misli o učenju Java konkurentnosti
Konkurentne komponente koje Java pruža grubo se dele u dve kategorije:
- Preventivno delovanje, sprečavanje grešaka, na primer ključna reč synchronized
- Pravovremeno ponavljanje kada do greške dođe, na primer CAS
Za konkurentne scenarije sa velikim brojem niti, razumnije je primeniti preventivne mere, pa većina niti neće zbog malo verovatnatog CAS pokušaja potrošiti mnogo CPU ciklusa; kada je broj niti mali, značaj CAS-a je veći, jer su troškovi promene konteksta niti od preventivnih mera veći od troška čekanja na CAS.
Da biste dobro naučili Java konkurentno programiranje, morate potpuno da razumete osnovne koncepte pomenute na slici ispod.

Po mom mišljenju, konkurentno programiranje uglavnom rešava dva bolna mesta:
- Problem nekonzistentnosti koji nastaje kada više niti pristupa istoj promenljivoj;
- Da bi se poboljšale performanse, mnoge izvršne jedinice računara imaju keš, što neizbežno utiče na konzistentnost podataka u konkurentnom programiranju.
Trebba podsetiti: iako se višenitna konkurentnost koristi za rešavanje problema performansi, to ne znači da u svim situacijama treba pokretati više niti — ponekad može dati suprotan efekat; ako nije izričit zahtev, ne pokrećite previše rano više niti.
Konkurentno programiranje je relativno teška oblast u Java sistemu i prilično iskušava unutrašnje znanje programera; zapravo, najranija oblast primene konkurentnog programiranja bila je realizacija operativnih sistema.
Ako već imaš izvesno iskustvo u programiranju, preporučujem da prvo naučiš „Računarsku arhitekturu” i stekneš opšti uvid u operativne sisteme, memoriju i CPU, a zatim pređeš na Java konkurentno programiranje — verovatno će ti biti mnogo udobnije!
Saglasno mog višegodišnjem iskustvu, konkurentno programiranje se može apstrahovati na tri ključna problema: podela rada, sinhronizacija i međusobno isključivanje.
- Podela rada
Podela rada znači kako efikasno rastaviti zadatak i dodeliti ga nitima; neki obrasci dizajna u oblasti konkurentnog programiranja, recimo proizvođač i potrošač, služe baš za podelu rada.
- Sinhronizacija
Sinhronizacija znači kako niti sarađuju — kada jedna nit završi zadatak, treba da obavesti drugu nit da krene. Uzmimo ponovo model proizvođač-potrošač: kada je red pun, proizvođačka nit čeka; kada red više nije pun, proizvođačka nit se budi i ponovo izvršava; kada je red prazan, potrošačka nit kreće da čeka, a kada nije prazna, potrošačka nit se ponovo budi.
- Međusobno isključivanje
Međusobno isključivanje znači osigurati da u istom trenutku samo jedna nit pristupa deljenom resursu — to je konačno oružje za rešavanje problema bezbednosti niti.
Kada više niti istovremeno pristupa istoj deljenoj promenljivoj, lako dolazi do problema „bezbednosti niti”, jer ishod može biti nesiguran — koren ovog problema leži u vidljivosti, uređenosti i atomičnosti — da bi ih rešio, Java uvodi pojam modela memorije, koji u izvesnoj meri ublažava problem „bezbednosti niti”, ali za potpuno rešenje ipak je potrebno međusobno isključivanje.
Osnovna tehnika međusobnog isključivanja jeste brava, na primer synchronized, kao i razne Lock varijante.
Brave mogu rešiti problem bezbednosti niti, ali istovremeno znače da performanse programa trpe.
Zbog toga Java pruža brave za različite scenarije, recimo read-write brava ReadWriteLock, koja rešava problem istovremenog čitanja iz više niti uz dopuštanje pisanja samo jednoj niti; ali i ReadWriteLock ima svoj problem — ako neka nit trenutno čita, nit koja piše mora da sačeka da niti koje čitaju oslobode bravu pre nego što dobije write brava, što znači da tokom čitanja nije dozvoljeno pisanje, pa spada u pesimistične read brave.
Da bi se dodatno podigla efikasnost konkurentnog izvršavanja, Java 8 uvodi novu read-write bravu StampedLock; u poređenju sa ReadWriteLock, prednost StampedLock-a je u tome što tokom čitanja dozvoljava dobijanje write brave i upis, ali problem je u tome što pročitani podaci mogu biti nekonzistentni, pa je potrebno malo dodatnog koda kojim se proverava da li je tokom čitanja bilo upisa — u suštini, to je optimistična brava.
Optimistična brava znači pretpostavku da tokom čitanja verovatno neće biti upisa, dok pesimistička brava za vreme čitanja odbija sve upise; razlika je u performansama — optimistička brava zahteva jedan dodatni korak provere za malo verovatan događaj, ali podiže performanse, dok pesimistička brava više garantuje „bezbednost niti”.
Kada sam ovako rekao, je li odmah jasnije!
Iako je Java konkurentno programiranje teško za učenje i dodiruje osnove poput operativnih sistema, CPU-a i memorije, ako istraješ, tvoje unutrašnje znanje će samo od sebe porasti za ceo stepen.
Konačno je tu prvi PDF otvorenog repozitorijuma znanja sa 17000+ zvezdica na GitHub-u „Ergeov put ka naprednoj Javi“! Obuhvata osnovnu sintaksu Jave, nizove i stringove, OOP, okvir kolekcija, Java IO, obradu izuzetaka, nove osobine Jave, mrežno programiranje, NIO, konkurentno programiranje, JVM itd. — ukupno preko 320 hiljada reči i 500+ ručno nacrtanih slika, razumljivo i sa humorom... Detalje pogledajte: „Odličan Java tutorijal sa 17000+ zvezdica na GitHub-u“.
