В чем выгода этого шаблона .Net - PullRequest
5 голосов
/ 15 апреля 2011

Я искал шаблон, который мог бы предоставить как поточно-безопасную, так и небезопасную версию одного и того же класса.Технические аспекты этого довольно очевидны.Я предполагаю, что надеялся найти соглашения об именах / доступе и т. Д. *

Так что я нахожу этот шаблон повсюду в пространстве имен 'Systems.Collections':

public class WhatEv
{
    private class SyncWhatEv : WhatEv
    {
        // overrides IsSyncronized = true
        // overrides whatever else to make it thread safe
    }

    public virtual bool IsSynchronized
    {
        get { return false; }  
    } 

    public static WhatEv Synchronized(WhatEv whatEv)
    {
        return new SyncWhatEv(whatEv);
    }
}

Существует несколько классовкоторые реализуют это: HashTable, Queue, ArrayList, Stack и т. д. Я понимаю наследование.Но зачем делать это закрытым вложенным классом и заставлять пользователя перепрыгивать через обруч, чтобы добраться до него?Есть ли какая-то польза от этого?

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

В большинстве случаев потокобезопасная версия объекта (т.е. Hashtable, Queue) не требуется. Следовательно, не имеет смысла добавлять накладные расходы, необходимые для обеспечения потоковой безопасности по умолчанию. Использование метода Synchronized позволяет пользователям, которым требуется безопасность потоков, получить версию с поддержкой потоков.

Синхронизированная версия объекта не добавляет никакой дополнительной функциональности, кроме поточной безопасности. Они не выставляют новых членов, и знание их базового типа действительно не помогает. Таким образом, они становятся приватными и просто «выглядят» как их публичный / базовый класс.

2 голосов
/ 15 апреля 2011

Теоретически это хорошая идея, и @CodeNaked имеет хорошее объяснение. На практике все еще есть проблемы с этим. Например, если вам нужно сделать 2 вызова в ваш потокобезопасный класс и вам нужна безопасность потоков для обоих вызовов вместе, вам все равно нужно сделать блокировку. Хорошее объяснение в этом пункте SO: В C # было бы лучше использовать Queue.Synchronized или lock () для безопасности потока?

0 голосов
/ 18 апреля 2011

После обдумывания этого на выходные и после получения дальнейших ответов.Я решил, что ответ: MS быть сумасшедшим.Весь смысл в предложении синхронизируемой версии объекта заключается в безопасности потока, но поток не может во время компиляции требовать версию объекта, безопасную для потока.Проверка этого объекта должна выполняться во время выполнения, что является ... фиктивным.

Спасибо всем за их вклад.Я ценю это.

...