Užraktas (programavimas)
Užraktas (angl. lock) – programavime naudojama sąvoka, apibūdinanti objektą, saugantį įėjimą į kodo sekcijas, kurių vykdymas vienu metu (lygiagrečiose gijose) yra negalimas arba apribotas.
Užraktas paprastai būna atsakingas už vienos konkrečios duomenų struktūros (vieno duomenų bazės įrašo, duomenų bazės indekso, grafinės vartotojo sąsajos komponento ir pan.) apsaugojimą nuo vienmetinio keitimo iškart keliomis gijomis. Tokie keitimai sukuria lenktynių aplinką ir gali sugadinti duomenų struktūros turinį. Užraktas pats yra objektas.
Užraktas turi bent vieną užrakinimo ir bent vieną atrakinimo metodą. Naujai sukurtas užraktas yra „atrakintas“. Gija, norinti keisti jo saugomą objektą, pirmiausia kviečia užrakto užrakinantį metodą, o baigusi keitimus – atrakinantį metodą. Jei tuo metu, kuomet užraktas užrakintas, jo užrakinimo metodą dar kartą kviečia kitos vykdymo gijos, šių gijų vykdymas pristabdomas, kol pirmoji gija užraktą atrakins. Atrakinus užraktą, viena iš laukiančių gijų „atgaivinama“, kartu jį užrakinant dabar jau šiai gijai.
Paprastai užraktą gali atrakinti tik ta vykdymo gija, kuri jį užrakino.
Užraktų tipai
[redaguoti | redaguoti vikitekstą]Pakartotinai užrakinamas (angl. reentrant) užraktas gali būti daug kartų rakinamas tos pačios gijos, kiekvieną kartą iškart suteikiant priėjimą prie saugomos struktūros. Toks užraktas turi rakinimų skaitiklį, kuris vienetu padidėja užrakinant ir vienetu sumažėja atrakinant. Užraktas atrakinamas tik tuomet, kai šio skaitiklio reikšmė lygi nuliui. Sykį užrakintą užraktą pakartotinai rakinti paprastai gali tik ta pati gija.
Skaitymo-rašymo užraktas suteikia dviejų tipų (skaitymo ir rašymo) leidimus. Skaitymo leidimas gali būti suteiktas tuo pat metu daugeliui gijų, tačiau negali būti suteiktas jei tuo metu kitai gijai suteiktas rašymo leidimas. Rašymo leidimas gali būti suteiktas tik vienai gijai.
Garbingas (angl. fair) užraktas atrakinus suteikia leidimą tai gijai, kuri šio leidimo laukė ilgiausiai. Taip išlyginamas gijų laukimo laikas, tačiau užrakto algoritmas tampa sudėtingesnis, „Garbingo“ užrakto naudojimas ne visada yra optimalus sprendimas.
Užraktai nėra skirti apriboti vienu metu su saugomu objektu dirbančių gijų skaičių kokia nors konkrečia (didesne nei vienetas) reikšme. Tam naudojami semaforai.
Literatūra
[redaguoti | redaguoti vikitekstą]- Java dokumentacija apie užraktus (anglų kalba).