Неліктен артық блоктау объектісі қажет?

Қызығушылығы MSDN арналған lock кілт сөзіне қарады:

class Account
{
    decimal balance;
    private Object thisLock = new Object();

    public void Withdraw(decimal amount)
    {
        lock (thisLock)
        {
            if (amount > balance)
            {
                throw new Exception("Insufficient funds");
            }
            balance -= amount;
        }
    }
}

Жоғарыдағы мысалда thisLock нысаны lock кілт сөзімен бірге пайдаланылады. Бұл не үшін қажет? Басқа мақсаттарға ие емес сияқты. Неге тек lock кілт сөзін өзі ғана емес?

4
@ChrisSinclair сіздің сұрағыңызға жауапты береді. Рахмет.
қосылды автор sprocket12, көзі
@ChrisSinclair сіздің сұрағыңызға жауапты береді. Рахмет.
қосылды автор sprocket12, көзі
Кілт сөздің өзі өзі жарамсыз C# болар еді. lock (this) {...} туралы ойлайсыз ба?
қосылды автор Jon Skeet, көзі
lock дегенді есікті құлыптау деп ойлаңыз. Қандай есік құлыпталуда? - бұл мәселе емес пе?
қосылды автор Eric Lippert, көзі
lock дегенді есікті құлыптау деп ойлаңыз. Қандай есік құлыпталуда? - бұл мәселе емес пе?
қосылды автор Eric Lippert, көзі
Мен теориялық деп ойлаймын, C# тілі/компиляторы үшін бірегей нысанды өңдейтін lock() ерекше құлып. Бірақ бірнеше ыңғайлылық сұрақтарын көтеру керек, мысалы: static немесе данасы деңгейін? lock (mySharedSyncObject) орнына lock() кездейсоқ қойылған құлыптарды бөліспей-ақ кездейсоқ бөлуге болмайды. Оны толығымен болдырмау және біздің құлыптау ниеті қолданғанымыз жөн.
қосылды автор Chris Sinclair, көзі
Мен теориялық деп ойлаймын, C# тілі/компиляторы үшін бірегей нысанды өңдейтін lock() ерекше құлып. Бірақ бірнеше ыңғайлылық сұрақтарын көтеру керек, мысалы: static немесе данасы деңгейін? lock (mySharedSyncObject) орнына lock() кездейсоқ қойылған құлыптарды бөліспей-ақ кездейсоқ бөлуге болмайды. Оны толығымен болдырмау және біздің құлыптау ниеті қолданғанымыз жөн.
қосылды автор Chris Sinclair, көзі

6 жауаптар

lock keyword cannot exist on it's own, it always takes a parameter which will act as a semaphore (synchronizing object), allowing only one thread to proceed.

http://www.albahari.com/threading/part2.aspx#_Тексеру

Тек бір жіп синхрондау нысанын (бұл жағдайда,   thisLock), және кез келген талшықтағы жіп бұғаттау шыққанға дейін бұғатталады. Егер бірден көп жіп бұғаттайды, онда олар   «дайын кезекте» кезекте тұрып,   бірінші кезектегі негізде (ескерту - бұл мінез-құлықтағы нюанстар   Windows және CLR кей кезектердің адалдығы кейде болуы мүмкін дегенді білдіреді   бұзылуы).

4
қосылды
Ия, оның бірыңғай нүктесі анық, бірақ мен жай ғана шатастырылдым, себебі тілдегі ерекшелігі әзірлеуші ​​автоматты түрде/кіріктіріле алатын болса, жұмысқа арналған нысанды құруға қажет болды? Сондықтан, бәлкім, оған көп нәрсе бар деп ойлаған едім.
қосылды автор sprocket12, көзі
Мысалы, бастапқы кодын қараңыз. microsoft.com/en-us/library/dd287191.aspx «rel =» nofollow noreferrer «> ConcurrentDictionary , ол кестенің әрбір бөлімі үшін бөлек құлыптау нысанын пайдаланады. Бұл кестеге әртүрлі бөлімдерде болған кезде, сөздікке (тіпті объектілерді алып тастағанда және қосқанда да) бір мезгілде қол жеткізуге мүмкіндік береді. Құлыптау нысанын бөлісу бір уақытта бір операция орын алуы мүмкін дегенді білдіреді.
қосылды автор Brian, көзі
@MuhammadA Бұл сыныпта бірыңғай lock операторы бірдей нысанды құлыптау үшін қолданатыны туралы болжам жасайды. Бұл жалған болжам. Бұл, ең алдымен, ең көп таралған операция болып табылады, бірақ сіз құлыптайтын әр түрлі нысандар (динамикалық немесе статикалық анықтау), сондай-ақ өте кең таралған. lock мәнін өте икемді етеді.
қосылды автор Servy, көзі

lock keyword cannot exist on it's own, it always takes a parameter which will act as a semaphore (synchronizing object), allowing only one thread to proceed.

http://www.albahari.com/threading/part2.aspx#_Тексеру

Тек бір жіп синхрондау нысанын (бұл жағдайда,   thisLock), және кез келген талшықтағы жіп бұғаттау шыққанға дейін бұғатталады. Егер бірден көп жіп бұғаттайды, онда олар   «дайын кезекте» кезекте тұрып,   бірінші кезектегі негізде (ескерту - бұл мінез-құлықтағы нюанстар   Windows және CLR кей кезектердің адалдығы кейде болуы мүмкін дегенді білдіреді   бұзылуы).

4
қосылды
Ия, оның бірыңғай нүктесі анық, бірақ мен жай ғана шатастырылдым, себебі тілдегі ерекшелігі әзірлеуші ​​автоматты түрде/кіріктіріле алатын болса, жұмысқа арналған нысанды құруға қажет болды? Сондықтан, бәлкім, оған көп нәрсе бар деп ойлаған едім.
қосылды автор sprocket12, көзі
Мысалы, бастапқы кодын қараңыз. microsoft.com/en-us/library/dd287191.aspx «rel =» nofollow noreferrer «> ConcurrentDictionary , ол кестенің әрбір бөлімі үшін бөлек құлыптау нысанын пайдаланады. Бұл кестеге әртүрлі бөлімдерде болған кезде, сөздікке (тіпті объектілерді алып тастағанда және қосқанда да) бір мезгілде қол жеткізуге мүмкіндік береді. Құлыптау нысанын бөлісу бір уақытта бір операция орын алуы мүмкін дегенді білдіреді.
қосылды автор Brian, көзі
@MuhammadA Бұл сыныпта бірыңғай lock операторы бірдей нысанды құлыптау үшін қолданатыны туралы болжам жасайды. Бұл жалған болжам. Бұл, ең алдымен, ең көп таралған операция болып табылады, бірақ сіз құлыптайтын әр түрлі нысандар (динамикалық немесе статикалық анықтау), сондай-ақ өте кең таралған. lock мәнін өте икемді етеді.
қосылды автор Servy, көзі

Мұнда бірнеше аспектілер бар:

  • lock операторлары идентификатор ретінде нысан сілтемесін қажет етеді. Бұл құлыпты анықтайтын және кодта болуы мүмкін кез келген басқа құлыптардан бөлетін нәрсе болуы керек.

  • Сіз қорғайтын деректер анықтамалық емес, сондықтан құлыптауға арналған идентификатор ретінде пайдалану үшін тағы бір нәрсе қажет.

  • Деректерді идентификатор ретінде пайдалану мүмкін болса да, құлыптау үшін идентификатор ретінде пайдаланылатын жеке нысанды пайдалану ұсынылады. Осылайша, сыныптан тыс анықтаманы ашуға ешқандай себеп жоқ, себебі егер ол сыныптан тыс құлыпта пайдаланылса, ықтимал тұйықталу жолдарын ашады.

0
қосылды

Мұнда бірнеше аспектілер бар:

  • lock операторлары идентификатор ретінде нысан сілтемесін қажет етеді. Бұл құлыпты анықтайтын және кодта болуы мүмкін кез келген басқа құлыптардан бөлетін нәрсе болуы керек.

  • Сіз қорғайтын деректер анықтамалық емес, сондықтан құлыптауға арналған идентификатор ретінде пайдалану үшін тағы бір нәрсе қажет.

  • Деректерді идентификатор ретінде пайдалану мүмкін болса да, құлыптау үшін идентификатор ретінде пайдаланылатын жеке нысанды пайдалану ұсынылады. Осылайша, сыныптан тыс анықтаманы ашуға ешқандай себеп жоқ, себебі егер ол сыныптан тыс құлыпта пайдаланылса, ықтимал тұйықталу жолдарын ашады.

0
қосылды

Құлыптау үшін пайдаланылатын зат артық емес. Нысан қарапайым үндестіру протоколын іске асыру үшін пайдаланылатын таңбалауыш ретінде әрекет етеді: құлыпты ұстаған кімге бұғатталған кодқа рұқсат беріледі. Барлық қалған құлыпты босатқанша күту керек.

Нысан болмаса, әртүрлі белгілер болуы мүмкін емес және барлық үндестіру бір ішкі таңбалауға негізделеді. Бұл өте тиімді болмас еді.

0
қосылды

Құлыптау үшін пайдаланылатын зат артық емес. Нысан қарапайым үндестіру протоколын іске асыру үшін пайдаланылатын таңбалауыш ретінде әрекет етеді: құлыпты ұстаған кімге бұғатталған кодқа рұқсат беріледі. Барлық қалған құлыпты босатқанша күту керек.

Нысан болмаса, әртүрлі белгілер болуы мүмкін емес және барлық үндестіру бір ішкі таңбалауға негізделеді. Бұл өте тиімді болмас еді.

0
қосылды