Почему плохо использовать lock(this)? - C#
Формулировка задачи:
почитав информацию из разных источников по этой теме, я ничего не понял
Магистры параллелизма, приведите, пожалуйста, наглядные примеры кода, которые иллюстрируют %topicname%
Когда можно использовать lock(this) и когда нельзя?
Изменится ли как-то состояние объекта, когда он заблокируется?
Решение задачи: «Почему плохо использовать lock(this)?»
textual
Листинг программы
interface IAsyncPrinter { Task PrintAsync(string message); } // Метод не знает ничего о потокобезопасности объекта resultsPrinter, // поэтому перестраховывается использованием lock void DoWork(IAsyncPrinter resultsPrinter) { var taskOne = Task.Run(() => { lock (resultsPrinter) { var t = resultsPrinter.PrintAsync("First part completed!"); Thread.Sleep(1); t.Wait(); } }); var taskTwo = Task.Run(() => { lock (resultsPrinter) { var t = resultsPrinter.PrintAsync("Second part completed!"); Thread.Sleep(1); t.Wait(); } }); Task.WaitAll(taskOne, taskTwo); } class LockThisThreadSafeAsyncPrinter : IAsyncPrinter { public Task PrintAsync(string message) { return Task.Run(() => { lock (this) { // имитируем запись в медленный потоконебезопасный приёмник Thread.Sleep(500); } Console.WriteLine(message); // консоль потокобезопасна }); } } class NoLockThisThreadSafeAsyncPrinter : IAsyncPrinter { private object _locker = new object(); public Task PrintAsync(string message) { return Task.Run(() => { lock (_locker) { // имитируем запись в медленный потоконебезопасный приёмник Thread.Sleep(500); } Console.WriteLine(message); // консоль потокобезопасна }); } } void Main() { Console.WriteLine("Block 1"); IAsyncPrinter asyncPrinter = new NoLockThisThreadSafeAsyncPrinter(); DoWork(asyncPrinter); Console.WriteLine("Block 2: deadlock"); asyncPrinter = new LockThisThreadSafeAsyncPrinter(); DoWork(asyncPrinter); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д