Си диез / Говнокод #26723 Ссылка на оригинал

0

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

Запостил: tablecell tablecell, (Updated )

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

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

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

        в джаве нельзя рази?
        Ответить
        • Да х.з., я не пробовал никогда, всегда отдельный объект под лочку держал.
          Ответить
          • а хатя навеное число это value object, может и нельзя
            Ответить
        • А зачем вообще в «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, то последовательно
        лол
        Ответить
      • Да, по числу нельзя конечно
        "'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
          Ответить
            • да там та же хуйня, причем пул интернированных строк можно хорошенечко забить, после чего и гц, и рантайм начинают охуевать (гц - потому что до пизды живых объектов, рантайм - потому что мапа интернированных строк не ресайзится)

              какой конкарренси )))
              Ответить
  • В Обжективе встречал лок на объект селектора метода, внутри которого была критическая секция.
    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8