Кіріспе

Компьютерлік ғылымда қайта кіретін мутекс (рекурсивті мутекс, рекурсивті құлып) – тұйықталуға себеп болмай, бір процесс/жіппен бірнеше рет құлыпталуы мүмкін өзара құлыптау (мутекс) механизмінің ерекше түрі. Кәдімгі мутекске (құлыпқа) «құлыптау» операциясын орындауға тырысылғанда, егер мутекс құлыпталған болса, операция сәтсіз аяқталады немесе тоқтатылады. Ал қайта кіретін мутексте бұл операция, егер және тек қана құлыптау жіпі құлыпты бұрыннан ұстап тұрса ғана сәтті аяқталады. Әдетте, қайта кіретін мутекс қанша рет құлыпталғанын есептейді және басқа жіптер оны құлыптамас бұрын, құлыптан шығару операциясын да сол санмен бірдей орындауды талап етеді.

Практикалық қолдану

W. Ричард Стивенс рекурсивті құлыптарды дұрыс қолданудың "қиын" екенін айтады және API-ды өзгертпей, бір жіпті кодты бейімдеу үшін оларды пайдалануды ұсынады, бірақ "басқа шешім болмаған жағдайда ғана". Java тілінің кіріктірілген синхрондау механизмі, монитор, рекурсивті құлыптарды қолданады. Синтаксистік тұрғыдан алғанда, құлып – "synchronized" түйін сөзінің алдында тұратын және мютекс ретінде пайдаланылатын кез келген Object сілтемесі бар код блогы. Синхрондалған блок ішінде берілген объект wait, notify немесе notifyAll арқылы шартты айнымалы ретінде қолданылуы мүмкін. Осылайша, барлық Object-ілер рекурсивті мютекс және шартты айнымалы болып табылады.

Сатып алу

Басқару шартын иелену. Егер иесі белгіленген болса, бірақ ағымдағы жіп емес болса, бақылау шарты хабарланғанша күтіңіз (бұл да шартын босатады). Иесін ағымдағы жіпке белгілеңіз. Иесінің идентификаторы осы сәтте тазартылған болуы керек, егер иеленуші бұрыннан ие болмаса. Иелену санын арттырыңыз (жаңа иелер үшін әрқашан 1-ге тең болуы керек). Басқару шартын босатыңыз.

Шығару

Бақылау шартын иесі босатушы екенін растап алыңыз. Саны нөлден кем емес екенін растап, сатып алу санын азайтыңыз. Егер сатып алу саны нөлге тең болса, меншік иесі туралы ақпаратты жойыңыз және бақылау шартына хабарлама жіберіңіз. Бақылау шартын босатыңыз.