Junior
Функсияи калиди lock дар забони C# чист?
sobes.tech AI
Ҷавоб аз AI
Калидвожа lock барои ҳамоҳангсозии дастрасӣ ба захираҳо дар барномаҳои бисёрсӯзишворӣ истифода мешавад. Он кафолат медиҳад, ки танҳо як сӯзишворӣ метавонад дар як вақт кодро дар дохили блоки lock иҷро кунад.
Принсипи кор:
lockҳамчун аргумент як объект мегирад, ки ҳамчун mutex (monitor) истифода мешавад.- Пеш аз иҷрои коди дохили блоки
lock, сӯзишворӣ кӯшиш мекунад, ки якбора блоки мустақилро дар объекти муайяншуда ба даст орад. - Агар блоки озод бошад, сӯзишворӣ онро мегирад ва кодро иҷро мекунад.
- Агар блоки дар дасти дигар сӯзишворӣ бошад, сӯзишвории ҳозира ба ҳолати интизорӣ мегузарад (блок мешавад) то ки блок озод шавад.
- Вақте ки аз блоки
lockмебарояд (ҳатто дар ҳолати истисно), блок озод мешавад.
Ин барои ҳимояи захираҳои умумӣ, мисли майдонҳои синфҳо, коллексияҳо ё дигар объектҳо, ки метавонанд ҳамзамон ба онҳо дастрасӣ пайдо кунанд, истифода мешавад, то ҳолатҳои рақобат (race conditions) пешгирӣ шаванд ва муттаҳидии маълумот таъмин карда шавад.
Маслиҳат барои истифода:
public class SharedResource
{
private int _counter;
private readonly object _lockObject = new object(); // Объект барои ҳамоҳангсозӣ
public void Increment()
{
lock (_lockObject) // Дастрасии ягона ба блоки код
{
_counter++; // Тағйироти бехатари захираи умумӣ
}
}
public int GetCounter()
{
lock (_lockObject) // Ҳамчунин дар хондан дастрасии ягона
{
return _counter;
}
}
}
Мавқеи муҳим:
- Объекти барои бастан бояд аз навъҳои истинодӣ бошад ва одатан ҳамчун майдони хусусӣ (
readonly) барои пешгирии дахлнопазирӣ истифода мешавад. - Аз бастани намудҳои монанди
string,thisёtypeof(TypeName)худдорӣ кунед, зеро онҳо метавонанд дар умум истифода шаванд ё аз берун дастрас бошанд, ки метавонад ба deadlock ва ё кори нодуруст оварда расонад. lockяк шакари синтаксисӣ барои истифодаи усулҳои синфMonitorмебошад.