1. C# / Говнокод #5895

    +120

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    public class XXX
    {
        private Object m_ForLock = new object();
        private String m_Path = "";
        public XXX(String Path)
        {
            lock (m_ForLock)
            {
                 m_Path = Path;
            }
         }
    }

    Запостил: javros, 05 Марта 2011

    Комментарии (16) RSS

    • в принципе, правильный и популярный паттерн
      правда, по отношению к String - абсурдно
      Ответить
      • Конструктор любого объекта всегда потокобезопасен.
        Ответить
        • аа... так это ещё и конструктор! не увидел сразу
          даа, жеесть
          Ответить
        • Даже если в нем вызываются потоконебезопасные функции?
          Ответить
          • Где здесь?
            Ответить
          • Здесь блокировка совершенно излишня. Не будут же в два потока создавать один объект ))
            Ответить
            • Здесь - не спорю. Но формулировка-то была иначе построена.
              >Конструктор любого объекта всегда потокобезопасен.
              Язык не дает таких гарантий.
              Ответить
              • Не будем говорить про сферического коня в вакууме, в приведенном говнокоде лок не нужен и точка.
                Ответить
                • У вас либо проблемы с русским языком, либо в установлении причинно-следственных связей. Перечитайте ветку еще раз.
                  Ответить
          • Функции останутся потоконебезопасными, они то тут причем?
            Ответить
            • При том, что если функция (конструктор, в частном случае) содержит вызов потоконебезопасных функций, она автоматически становится потоконебезопасной. Конструктор может обращаться не только к полям создаваемого объекта. И из того, что он вызывается для каждого конкретного объекта один раз не делает его потокобезопасным для любого объекта.
              Ответить
              • Потокобезопасность определяется только для методов, которые могут быть вызваны для одного и того же набора данных в разных потоках одновременно. Конструктор под это определение не попадает, так как он на своем наборе данных может быть вызван только в одном потоке.

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

                static class MyThreadSafeClass
                {
                [MethodImpl(MethodImplOptions.Synchronized)]
                public static void Run()
                {
                    SomeData.AccessRaw();
                }
                }


                Казалось бы, все хорошо. Стал ли метод потокобезопасным? Скорее всего, нет, так как если SomeData.AccessRaw() не обеспечивает потокобезопасности, то к нему может получить доступ другой поток из другой области кода, которая не покрывается синхронизацией CLR.

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

                Поэтому конструктор объекта всегда потокобезопасен. Он становится потокобезопасен на уровне CLR в том случае, если работает только со своими методами и членами уровня экземпляра или с другими потокобезопасными объектами и методами. Это для педантов.
                Ответить
                • Вот чего не понял, так это как из
                  > "я любой потоконебезопасный конструктор считаю грубейшей ошибкой"
                  вытекает
                  > "Поэтому конструктор объекта всегда потокобезопасен" .
                  А если и не вытекает, то как может сосуществовать одновременно?
                  Ответить
    • Говнокод. Однозначно.
      Ответить

    Добавить комментарий