Почему плохо использовать lock(this)? - C#

Узнай цену своей работы

Формулировка задачи:

почитав информацию из разных источников по этой теме, я ничего не понял Магистры параллелизма, приведите, пожалуйста, наглядные примеры кода, которые иллюстрируют %topicname% Когда можно использовать lock(this) и когда нельзя? Изменится ли как-то состояние объекта, когда он заблокируется?

Решение задачи: «Почему плохо использовать lock(this)?»

textual
Листинг программы
  1. interface IAsyncPrinter
  2. {
  3.     Task PrintAsync(string message);
  4. }
  5.  
  6. // Метод не знает ничего о потокобезопасности объекта resultsPrinter,
  7. // поэтому перестраховывается использованием lock
  8. void DoWork(IAsyncPrinter resultsPrinter)
  9. {
  10.     var taskOne = Task.Run(() =>
  11.     {
  12.         lock (resultsPrinter)
  13.         {
  14.             var t = resultsPrinter.PrintAsync("First part completed!");
  15.             Thread.Sleep(1);
  16.             t.Wait();
  17.         }
  18.     });
  19.  
  20.     var taskTwo = Task.Run(() =>
  21.     {
  22.         lock (resultsPrinter)
  23.         {
  24.             var t = resultsPrinter.PrintAsync("Second part completed!");
  25.             Thread.Sleep(1);
  26.             t.Wait();
  27.         }
  28.     });
  29.    
  30.     Task.WaitAll(taskOne, taskTwo);
  31. }
  32.  
  33. class LockThisThreadSafeAsyncPrinter : IAsyncPrinter
  34. {
  35.     public Task PrintAsync(string message)
  36.     {
  37.         return Task.Run(() =>
  38.         {
  39.             lock (this)
  40.             {
  41.                 // имитируем запись в медленный потоконебезопасный приёмник
  42.                 Thread.Sleep(500);
  43.             }
  44.             Console.WriteLine(message); // консоль потокобезопасна
  45.         });
  46.     }
  47. }
  48.  
  49. class NoLockThisThreadSafeAsyncPrinter : IAsyncPrinter
  50. {
  51.     private object _locker = new object();
  52.    
  53.     public Task PrintAsync(string message)
  54.     {
  55.         return Task.Run(() =>
  56.         {
  57.             lock (_locker)
  58.             {
  59.                 // имитируем запись в медленный потоконебезопасный приёмник
  60.                 Thread.Sleep(500);
  61.             }
  62.             Console.WriteLine(message); // консоль потокобезопасна
  63.         });
  64.     }
  65. }
  66.  
  67. void Main()
  68. {
  69.     Console.WriteLine("Block 1");
  70.     IAsyncPrinter asyncPrinter = new NoLockThisThreadSafeAsyncPrinter();
  71.     DoWork(asyncPrinter);
  72.    
  73.     Console.WriteLine("Block 2: deadlock");
  74.     asyncPrinter = new LockThisThreadSafeAsyncPrinter();
  75.     DoWork(asyncPrinter);
  76. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы