Почему блокировка публичного объекта - плохая идея

Если у вас есть уникальные ключи, и более быстрое извлечение - это то, что вам очень нравится, вы можете использовать карту вместо массива (если есть жесткий случай использования массива, то это не сработает курс). Если вы используете карту, вы просто проверяете «if (num in arr)».

16
задан Chris Barlow 2 July 2014 в 21:39
поделиться

3 ответа

Ну, во-первых, вы могли бы создать третий класс:

internal class ImplementationDetail
{
    private static readonly object lockme = new object();
    public static void DoDatabaseQuery(whatever)
    {
        lock(lockme)
             ReallyDoQuery(whatever);
    }
}

, а теперь UseSQLKatana и UseSQLCutlass вызывают реализациюDetail.DoDatabaseQuery.

Во-вторых, вы можете решить не беспокоиться об этом и заблокировать объект, который виден обоим типам. Основная причина этого заключается в том, что становится трудно определить, кто блокирует объект, и трудно защитить от враждебного частично доверенного кода, блокирующего объект злонамеренно. Если вас не волнует ни один недостаток, вам не нужно слепо следовать рекомендациям.

16
ответ дан configurator 2 July 2014 в 21:39
поделиться

Используйте Mutex.
Вы можете создать мьютекс в основном классе и вызывать метод Wait в начале каждого класса (метода); затем установите мьютекс так, чтобы при вызове другого метода он дождался окончания первого класса.
Ах, не забудьте освободить мьютекс, выходящий из этих методов ...

2
ответ дан Marco 2 July 2014 в 21:39
поделиться

Здесь я вижу два разных вопроса:

Почему плохая идея lock на публичном объекте?

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

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

Как заблокировать эти методы, чтобы они не работали в тандеме?

Вы можете рассмотреть Mutex учебный класс; создание «глобального» мьютекса позволит вашим классам работать на основе знания состояния блокировки во всем приложении. Или вы можете использовать общий экземпляр ReaderWriterLockSlim , но я бы не стал рекомендовать его совместное использование между классами.

0
ответ дан Grant Thomas 2 July 2014 в 21:39
поделиться
Другие вопросы по тегам:

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