1. Защо заключване и какво е заключено?
Когато използваме нишки, най-ефективният начин е, разбира се, асинхронен, тоест всяка нишка да работи едновременно, без да разчитаме една на друга и да чакаме. Въпреки това, когато различни нишки трябва да имат достъп до определен ресурс, е необходим механизъм за синхронизация, тоест при четене и записване на един и същ ресурс, трябва да направим ресурса да се управлява само от една нишка едновременно, за да се гарантира, че всяка операция е ефективна и незабавна, тоест да се гарантира атомичността на нейната работа. заключването е най-често използваният метод за синхронизация в C#, във формата lock(objectA){codeB}.
lock(objectA){codeB} изглежда просто, но всъщност има три значения, което е от съществено значение за правилното му използване: 1. ОбектА заключен ли е? Ако не, ще го заключа, иначе ще изчакам да бъде пуснат обектА. 2. След заключване, другите нишки не могат да извикват codeB или да използват objectA по време на изпълнението на codeB. 3. След изпълнение на codeB, освобождаването на objectA, и codeB може да бъде достъпен от други нишки.
2. Какво стана с заключването (това)?
Нека разгледаме един пример:
В t1 нишката LockMe извиква lock(this), тоест c1 в основната функция, и при извикване на lock(c1) в основната нишка, трябва да изчака lock block в t1 да бъде изпълнен, преди да достъпи c1, тоест всички операции, свързани с c1, не могат да бъдат завършени, така че виждаме, че дори c1. DoNotLockMe() не се изпълнява.
|