Почему блокировки выполняются на отдельных объектах? [дубликат]

$ touch {1,2}.txt
$ ls [12].txt
1.txt  2.txt
$ rm !:1
rm [12].txt
$ history | tail -10
...
10007  touch {1,2}.txt
...
$ !10007
touch {1,2}.txt
$ for f in *.txt; do mv $f ${f/txt/doc}; done
17
задан Community 23 May 2017 в 11:59
поделиться

3 ответа

Блокировка отдельного закрытого фиктивного объекта дает вам гарантию, что никто другой не заблокирует этот объект.

Если вы заблокируете данные, и этот же фрагмент данных будет виден извне вы теряете эту гарантию. Например:

public class MyObject
{
    public void SharedMethod()
    {
        lock (this)
        {
            // Do stuff
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyObject o = new MyObject();

        lock (o)
        {
            new Thread(() =>
            {
                // Gets blocked 2s because of external lock
                o.SharedMethod();
            }).Start();

            Thread.Sleep(2000);
        }
    }
}
19
ответ дан 30 November 2019 в 12:36
поделиться

В блоге Эрика Ганнерсона об этом есть много интересного. См. здесь и здесь .

2
ответ дан 30 November 2019 в 12:36
поделиться

Джефф Рихтер (автор CLR через C #) объясняет, почему в этой статье о Safe Thread Synchronization .

В частности, в этой статье на ваш вопрос отвечает раздел «Почему великая идея не так хороша».

На самом деле это глава из книги CLR Via C # .

В итоге наличие частного объекта в качестве объекта «synclock» позволяет вашему классу инкапсулировать и контролировать любую блокировку, необходимую вашему классу. Следовательно, независимо от того, сколько клиентов используют ваш класс, блокировка выполняется последовательно и правильно.

В частности, в этой статье на ваш вопрос отвечает раздел «Почему великая идея не так хороша?»

На самом деле это глава из книги CLR Via C # .

В итоге наличие частного объекта в качестве объекта «synclock» позволяет вашему классу инкапсулировать и контролировать любую блокировку, необходимую вашему классу. Следовательно, независимо от того, сколько клиентов используют ваш класс, блокировка выполняется последовательно и правильно.

В частности, в этой статье на ваш вопрос отвечает раздел «Почему великая идея не так хороша».

На самом деле это глава из книги CLR Via C # .

В итоге наличие частного объекта в качестве объекта «synclock» позволяет вашему классу инкапсулировать и контролировать любую блокировку, необходимую вашему классу. Следовательно, независимо от того, сколько клиентов используют ваш класс, блокировка выполняется последовательно и правильно.

9
ответ дан 30 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: