Подтвердить что ты не робот

Lock() в статическом методе

У меня есть многопоточное приложение, которое записывает в файл настроек xml с использованием статического метода. Я хочу избегать того, что файл обновляется дважды в одно и то же время (вызывает исключение доступа/записи).

Как это сделать?

Это не работает:

namespace Program
{
    public class Settings
    {
        private static void SetSettingsValue (string settings, string value)
        {
            // make this thread safe to avoid writing to a locked settings xml file
            lock (typeof(Settings))
            {
                //write data to xml file
            }
        }
    }
}
4b9b3361

Ответ 1

Понятие lock() заключается в использовании существующего объекта, который он может ссылаться и использовать для управления предоставлением доступа.

static object SpinLock = new object();

lock(SpinLock)
{
   //Statements
}

Когда выполнение оставляет блок блокировки(), эта ссылка освобождается, и любые другие потоки, ожидающие выполнения кода, могут продолжать (по одному, конечно).

Ответ 2

Вам следует создать отдельный статический объект блокировки и использовать его. НЕ ИСПОЛЬЗУЙТЕ СТРОКУ! Строки автоматически интернированы и будет только один экземпляр каждой программно объявленной строки, поэтому вы не можете гарантировать эксклюзивный доступ к блокировке.

Вы должны сделать это:

public class A {
    private static Object LOCK = new Object();

    private static void foo() {
        lock(LOCK) {
            // Do whatever
        }
    }
}

(Синтаксис может быть неправильным: я человек Java, в основном, но те же правила о блокировке и интерполяции строк относятся к С#)

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

Возьмите домашние сообщения: для блокировки статического метода для частной статической переменной. Не блокируйте строки или typeof (...), потому что вы не можете гарантировать, что никто не использует этот объект. Всегда блокируйте объект, который, как вы знаете, не тронут кем-либо другим, сделав его закрытым и сделав его новым.