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

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    /// <summary>
            /// Сохранение описания отеля в базу данных.
            /// </summary>
            public void Save()
            {
                lock ("save")
                {

    Запостил: tablecell, 01 Июня 2020

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

    • на самом деле не так страшно: литерал все равно один же
      Ответить
      • Можно даже об небольшие числа лочиться тогда?

        lock (42) { ... }
        Ответить
        • ну да, пул же

          в джаве нельзя рази?
          Ответить
          • Да х.з., я не пробовал никогда, всегда отдельный объект под лочку держал.
            Ответить
          • А зачем вообще в «Java» и в «C#» придумали числа, которые не «plain old data»? Это же не скриптушня с динамической тупизацией.
            Ответить
            • В Java то понятно зачем, дженерики хуёвые. В C# - х.з., особой причины не вижу.
              Ответить
              • я ж грю, я мог напиздеть вам. Может быть число это только валуетайп всегда, живет на стеке, копируется по значению, а значит нельзя навеное лочнуться
                Ответить
            • в джаве это враппеы, чтобы хранить их в куче, напрример
              в C# может быть они обычные вауле тайп точно, я мог наврать
              Ответить
        • вот так в джавке треды будут работать последовательно

          ExecutorService executorService = Executors.newFixedThreadPool(42);
          
                  Runnable runnable = () -> {
                      synchronized (Integer.valueOf(42)) {
                          for (int i = 0; i < 10; i++) {
                              System.out.printf("%s %s\n", Thread.currentThread().getId(), i);
                          }
                      }
                  };
                  executorService.submit(runnable);
                  executorService.submit(runnable);
                  executorService.submit(runnable);
                  executorService.submit(runnable);
                  executorService.submit(runnable);


          А если 42 поменять на 100500, то последовательно
          лол
          Ответить
          • А всё потому что «Integer Cache». Его там даже пропатчить можно и сделать, ЕМНИП, 2*2==5.
            Ответить
        • Да, по числу нельзя конечно
          "'int' is not a reference type as required by the lock statement"

          А по строке работает ровно так, как я и предпологал.
          static class Program
              {
                  private const int Size = 4;
          
                  static void Main()
                  {
                      var barrier = new Barrier(Size + 1);
          
                      for (var _ = 0; _ < Size; _++)
                      {
                          ThreadPool.QueueUserWorkItem(state =>
                          {
                              lock ("PETOOOOOOZ")
                              {
                                  for (var i = 0; i < 10; i++)
                                  {
                                      Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
                                      Thread.Sleep(10);
                                  }
                              }
          
                              barrier.SignalAndWait();
                          });
                      }
          
                      barrier.SignalAndWait();
                  }
              }

          выдает номера тредов последовательно.

          Кстати, lock() это C#. В Java это syncronized()
          Ответить
        • можно. но тогда боксинг будет генерировать новый обьект всегда. т.е. никакого лока
          Ответить
          • отказался бокситься же, не?
            "'int' is not a reference type as required by the lock statement"

            а если бы и боксанулся, то в C# нету пула малых чисел, как в java?
            Ответить
      • А если я в двух местах об литерал "save" залочусь? Он же один.
        Ответить
        • ну синхронизируешься по нему
          Ответить
          • и трешь ево интернированные губы
            Ответить
            • интернировать строки не
              Ответить
              • рантайм не спрашивает
                Ответить
                • литерралы и так интернированы, как американские японцы во вторрую мировую
                  Ответить
      • он может один но ты не можешь гарантировать что это только один экземпляр на всю вселенную
        Ответить
        • при каких обстоятельствах может получиться два строковых литерала?
          Ответить
          • во жопа какая. впервые узнал что "Object.ReferenceEquals("1", "1")" == true.

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

                какой конкарренси )))
                Ответить
                • Приведи реальный пример кода, в котором рантайм охуевает.
                  Ответить
                  • береш стрингбилдер, строиш миллион миллионов разных строк, и всех их интернируешь. Если рантаем охуеет, значит Файк прав
                    Ответить
                  • https://shipilev.net/jvm/anatomy-quarks/10-string-intern/#_experiment_gc_pauses
                    Ответить
                    • Пиздец конечно. Такое говно на пустом месте развели.
                      ГЦ не нужен
                      Ответить
                      • Гиздец конечно. Такое говно на пустом месте развели.
                        ПЦ не нужен
                        Ответить
                        • Заяц ГЦ и его воображаемые друзья: питуз, зелибоба, и свинособачья отбивная с перловкой
                          Ответить
                        • Киздец гонечно. Накое повно та густом ресте мазвели.
                          НЦ не гужен
                          Ответить
                          • Я как только с кост коллйттм разолся, т зурас назить пожбал. Вы клятмпор как утииита полное говно. Опкоды-хуйкоды. Элиминация мертвого кода. Я вас/тебя элиминирую в некотором количестве дней.
                            Ответить
    • В Обжективе встречал лок на объект селектора метода, внутри которого была критическая секция.
      Ответить

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