использовать один и тот же объект блокировки на два разных блока кода? - PullRequest
17 голосов
/ 23 февраля 2012

Могу ли я использовать один и тот же объект блокировки двумя способами, доступ к которым осуществляется двумя разными потоками? Цель состоит в том, чтобы сделать задачи 1 и 2 безопасными.

object lockObject = new object();

// Thread 1
void Method1()
{
    lock(lockObject)
    {
        // task1
    }
}

// Thread 2
void Method2()
{
    lock(lockObject)
    {
        // task2
    }
}

Ответы [ 3 ]

21 голосов
/ 23 февраля 2012

Да, вы можете использовать один и тот же объект блокировки (технически это монитор в смысле информатики и реализован с помощью вызовов методов в System.Monitor ) в двух разныхметодов.

Итак, скажем, что у вас есть некоторый статический ресурс r, и вы хотели, чтобы два потока обращались к этому ресурсу, но только один поток может использовать его одновременно (это классическая цель блокировки).Затем вы должны написать код, подобный

public class Foo
{
    private static object _LOCK = new object();

    public void Method1()
    {
        lock (_LOCK)
        {
            // Use resource r
        }
    }

    public void Method2()
    {
        lock (_LOCK)
        {
            // Use resource r
        }
    }
}

. Вам нужно ограничиться каждым использованием r в вашей программе, так как в противном случае два потока могут использовать r одновременно.Кроме того, вы должны использовать одну и ту же блокировку, так как иначе два потока смогут одновременно использовать r.Таким образом, если вы используете r в двух разных методах, вы должны использовать одну и ту же блокировку для обоих методов.

EDIT: как @diev указывает в комментариях, если ресурсбыли бы для каждого экземпляра объектов типа Foo, мы не сделали бы _LOCK статическими, но сделали бы _LOCK данные уровня экземпляра.

5 голосов
/ 23 февраля 2012

Если вы хотите, чтобы разные потоки не выполняли задачу 1 и задачу 2 одновременно, тогда вы должны использовать одинаковый объект блокировки.одни и те же ресурсы, вы можете использовать разные объекты блокировки.

4 голосов
/ 23 февраля 2012

Да.

Можно и это работает.Если вы не используете один и тот же объект, блоки могут выполняться одновременно.Если вы используете один и тот же объект, они не могут.

Также вы имеете в виду lock(lockObject), а не using(lockObject).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...