b'\n_START_ARTICLE_\nLygiagretusis programavimas\n_START_SECTION_\nKritin\xc4\x97s sekcijos\n_START_PARAGRAPH_\nInformacijos apsikeitimui naudojamos kritin\xc4\x97s sekcijos \xe2\x80\x93 apsaugotos kodo atkarpos, \xc4\xaf kurias vienu metu gali patekti tik vienas vykdytojas (gija arba procesas). Kiti procesai, norintys atlikti \xc5\xa1iuos veiksmus, yra pristabdomi. Baigus darb\xc4\x85 kritin\xc4\x97je sekcijoje, vienas i\xc5\xa1 pristabdyt\xc5\xb3 proces\xc5\xb3 yra pa\xc5\xbeadinamas ir t\xc4\x99sia darb\xc4\x85 kritin\xc4\x97je sekcijoje. \xc5\xa0ioje vietoje veiksmus gali atlikti tik vienas procesas vienu metu, o kiti procesai laukia ir tokiu b\xc5\xabdu l\xc4\x97tina programos veikim\xc4\x85._NEWLINE_Neatsargiai naudojamos kritin\xc4\x97s sekcijos gali sul\xc4\x97tinti sistemos darb\xc4\x85. Pagreitinti program\xc4\x85 galima atsisakius perteklini\xc5\xb3 kritini\xc5\xb3 sekcij\xc5\xb3, jas supaprastinus iki minimumo, kad joje procesas u\xc5\xbetrukt\xc5\xb3 tik tiek, kiek reikia informacijos apsikeitimui ir apsaugojimui._NEWLINE_Kritini\xc5\xb3 sekcij\xc5\xb3 apsaugai yra sukurta daug priemoni\xc5\xb3. Bene pirmoji sukurta \xe2\x80\x93 semaforas.\n_START_SECTION_\nKritini\xc5\xb3 sekcij\xc5\xb3 pavyzd\xc5\xbeiai\n_START_PARAGRAPH_\nPateikiami keli pavyzd\xc5\xbeiai Java kalba. Pirmame pavyzdyje kritin\xc4\x97s sekcijos apsauga nenaudojama (rezultatas \xe2\x80\x93 nenusp\xc4\x97jamas):_NEWLINE__NEWLINE_package testas;_NEWLINE_class BendriDuomenys {_NEWLINE_        public static int skaicius = 0;_NEWLINE_        public static void keisti() {_NEWLINE_                skaicius++;_NEWLINE_                skaicius--;_NEWLINE_        }_NEWLINE_        public static boolean arNulis() {_NEWLINE_                return skaicius == 0;_NEWLINE_        }_NEWLINE_}_NEWLINE_class Gija1 extends Thread {_NEWLINE_        private long pradzia;_NEWLINE_        public void run() {_NEWLINE_                pradzia = System.currentTimeMillis();_NEWLINE_                while (System.currentTimeMillis() \xe2\x80\x93 pradzia < 1000) {_NEWLINE_                        BendriDuomenys.keisti();_NEWLINE_                }               _NEWLINE_        }_NEWLINE_}_NEWLINE__NEWLINE_class Gija2 extends Thread {_NEWLINE_        private long pradzia;_NEWLINE_        public void run() {_NEWLINE_                pradzia = System.currentTimeMillis();_NEWLINE_                while (System.currentTimeMillis() \xe2\x80\x93 pradzia < 1000) {_NEWLINE_                        if (!BendriDuomenys.arNulis()) {_NEWLINE_                                System.out.println(\xe2\x80\x9eNe nulis\xe2\x80\x9c);_NEWLINE_                        }_NEWLINE_                }               _NEWLINE_        }       _NEWLINE_}_NEWLINE__NEWLINE_public class Testas {_NEWLINE_        public static void main(String[] args) {_NEWLINE_                Gija1 gija1 = new Gija1();_NEWLINE_                Gija2 gija2 = new Gija2();_NEWLINE_                gija1.start();_NEWLINE_                gija2.start();_NEWLINE_        }_NEWLINE_}_NEWLINE_\xc5\xa0iek tiek pakoregavus, gaunamas kodas, kuriame naudojama kritin\xc4\x97s sekcijos apsauga:_NEWLINE__NEWLINE_..._NEWLINE_public synchronized static void keisti()_NEWLINE_..._NEWLINE_public synchronized static boolean arNulis()_NEWLINE_..._NEWLINE_\xc5\xa0iuo atveju monitorius apsaugo duomenis, kad jie neb\xc5\xabti kei\xc4\x8diami keli\xc5\xb3 gij\xc5\xb3 vienu metu, taigi rezultatai tampa nusp\xc4\x97jami. Nesunkiai galime apskai\xc4\x8diuoti, kiek kart\xc5\xb3 kiekvien\xc4\x85 kart\xc4\x85 bus kvie\xc4\x8diami metodai (naudojant monitori\xc5\xb3 ir nenaudojant). Ta\xc4\x8diau, kaip min\xc4\x97ta, kritini\xc5\xb3 sekcij\xc5\xb3 apsauga yra labai brangi laiko at\xc5\xbevilgiu. \xc4\xaeprastame asmeniniame kompiuteryje su Windows XP operacine sistema ir Sun kompanijos JRE 1.5 antrasis pavyzdys su monitoriais veik\xc4\x97 3 kartus l\xc4\x97\xc4\x8diau nei pirmasis be monitori\xc5\xb3, ta\xc4\x8diau priklausomai nuo JVM (Java kalbos Virtualios Ma\xc5\xa1inos) realizacijos ir operacin\xc4\x97s sistemos teikiam\xc5\xb3 galimybi\xc5\xb3 rezultatai gali skirtis.\n_START_SECTION_\nU\xc5\xberaktas\n_START_PARAGRAPH_\nMin\xc4\x97tuose pavyzd\xc5\xbeiuose kritin\xc4\x97s sekcijos yra apsaugotos sinchronizavimo rakta\xc5\xbeod\xc5\xbeiu. Toks apsaugos b\xc5\xabdas labai paprastas, ta\xc4\x8diau jis gali netikti jei reikia saugoti ne kodo sekcij\xc4\x85 nuo vykdymo, o duomen\xc5\xb3 strukt\xc5\xabr\xc4\x85 nuo lygiagretaus manipuliavimo \xc4\xafvairiomis kodo sekcijomis. Tuomet vartojamas u\xc5\xberaktas, kuris paprastai b\xc5\xabna susietas su tokia saugoma duomen\xc5\xb3 strukt\xc5\xabra. U\xc5\xberaktai prireikus leid\xc5\xbeia suteikti skaitymo leidimus, kurie vienu metu gali b\xc5\xabti i\xc5\xa1duodami ir daugeliui gij\xc5\xb3) ir ra\xc5\xa1ymo leidim\xc4\x85 (kuris vienu metu gali b\xc5\xabti suteiktas tik vienai gijai ir tik tada, jei n\xc4\x97ra i\xc5\xa1duot\xc5\xb3 skaitymo leidim\xc5\xb3).\n_START_SECTION_\nSemaforas\n_START_PARAGRAPH_\nSemaforai naudojami, kuomet pageidaujama, jog su tam tikra duomen\xc5\xb3 strukt\xc5\xabra ar kompiuterio \xc4\xafrenginiu nedirbt\xc5\xb3 daugiau nei nurodytas ribotas skai\xc4\x8dius lygiagre\xc4\x8di\xc5\xb3 gij\xc5\xb3._NEWLINE_Semaforas yra strukt\xc5\xabra, turinti j\xc4\x85 sukuriant nustatyt\xc4\x85 leidim\xc5\xb3 skai\xc4\x8di\xc5\xb3 dirbti su saugoma duomen\xc5\xb3 strukt\xc5\xabra ar vykdyti saugom\xc4\x85 kodo sekcij\xc4\x85. Kiekviena gija, prie\xc5\xa1 prad\xc4\x97dama darb\xc4\x85 su saugoma sekcija, turi gauti i\xc5\xa1 semaforo leidim\xc4\x85 (kviesdama semaforo metod\xc4\x85), o baigusi darb\xc4\x85 su saugomu objektu \xe2\x80\x93 leidim\xc4\x85 gr\xc4\x85\xc5\xbeinti. Jei semafore daugiau \xc5\xa1iuo metu leidim\xc5\xb3 neb\xc4\x97ra (jo likusi\xc5\xb3 leidim\xc5\xb3 skaitiklis lygus nuliui), leidimo pra\xc5\xa1anti gija blokuojama, kol kokia nors kita gija anks\xc4\x8diau pasiimt\xc4\x85 leidim\xc4\x85 gr\xc4\x85\xc5\xbeins._NEWLINE_Jei semaforas turi tik vien\xc4\x85 leidim\xc4\x85, jo darbas daug nesiskiria nuo u\xc5\xberakto. Ta\xc4\x8diau, skirtingai nuo u\xc5\xberakt\xc5\xb3, semaforai paprastai leid\xc5\xbeia gr\xc4\x85\xc5\xbeinti leidim\xc4\x85 ir ne tai gijai, kuri j\xc4\xaf pasi\xc4\x97m\xc4\x97. Kai kuriuose algoritmuose tai gali b\xc5\xabti reikalinga, nors \xc5\xa1iai galimybei reikalingi sinchronizavimo veiksmai gali s\xc4\x85lygoti l\xc4\x97tesn\xc4\xaf darb\xc4\x85 nei naudojant u\xc5\xberaktus.\n_START_SECTION_\nLak\xc5\xabs kintamieji\n_START_PARAGRAPH_\nKai kuriose sistemose yra efektyviau visus kiekvienos gijos naudojamus duomenis saugoti atskiroje, su ta gija susietoje atminties dalyje. Jei tie patys duomenys skaitomi bei kei\xc4\x8diami ir i\xc5\xa1 kitos gijos, vis\xc5\xb3 kopij\xc5\xb3 reik\xc5\xa1m\xc4\x97s automati\xc5\xa1kai sulyginamos._NEWLINE_Jei algoritmas reikalauja, jog kintamojo reik\xc5\xa1m\xc4\x97 skirtingose gijose niekada net ir trumpam netapt\xc5\xb3 skirtinga, toks kintamasis vadinamas lakiu (angl. volatile). Lak\xc5\xabs kintamieji deklaruojami specialiu rakta\xc5\xbeod\xc5\xbeiu (java tas rakta\xc5\xbeodis yra \xe2\x80\x9evolatile\xe2\x80\x9c).'