1. Java / Говнокод #8255

    +78

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    // inside some method
    final DateFormat dateFormat = i18n.getDateFormat();
    synchronized (dateFormat) {
        formatedViolationDate = (violationDate != null) ?
        dateFormat.format(violationDate) : "";
    }

    i18n.getDateFormat() возвращает статический объект DateFormat, который может использоваться несколькими потоками. В руки бы накласть тому, кто это писал.
    Решение: getDateFormat() возвращает строку формата, объект формата создаем при каждом вызове.

    Запостил: roman-kashitsyn, 20 Октября 2011

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

    • показать все, что скрытоА мое решение задачи про забывчивый стек потокобезопасно. Так как операции производятся за О(1), то и про потоки волноваться не надо.
      Ответить
      • > Так как операции производятся за О(1), то и про потоки волноваться не надо
        ахуенная логика
        Ответить
        • показать все, что скрытоИмеете аргументы против?
          Ответить
        • печально, что такие высеры, с виду созданные с помощью цепей Маркова, может производить и живой человек.
          Ответить
        • > Так как операции производятся за О(1), то и про потоки волноваться не надо

          Просто O(1) это очень быстро, шедулер не успеет переключиться на другую задачу. Поверьте, я у себя на ноутбуке три раза всё проверил
          Ответить
    • даты плавно перетекли в java
      Ответить
    • > violationDate
      ага, "дата, когда меня изнасиловали"...
      Ответить
    • а что, dateFormat.format непотокобезопасен?
      Ответить
      • "Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally."
        http://download.oracle.com/javase/1.4.2/docs/api/java/text/DateFormat.html
        Ответить
        • Какой пиздец. Ну используй thread_local. Или его в JAWA нету?
          Ответить
          • Есть. Проблема в том, что в йажа никак не выражалось (и не выражается до сих пор) потокобезопасность. Потому когда программист пишет класс, он подкидывает монетку, и в зависимости от её результата делает класс потокобезопасным (синхронизируя доступ к данным, делая тредлокал и пр) или не потокобезопасным.

            К примеру, StringBuilder потоконебезопасен, а StringBuffer наоборот (или наоборот, я их путаю).

            Пользователь класса должен по названию угадать потокобезопасный он или нет (со временем вырабатываается такая привычка, например ArrayList не безопасен, а Vector соответственно безопасен).

            DateFormat не безопасный, но к сожалению, но новочки часто не могут этого угадать, шарят его между тредами, и получают смешной багор
            Ответить
            • А в чём «небезопасность» стринг билдера и листа? Какие багры можно поймать? Я думал в JAWA нет UB.
              Ответить
              • Потоконебезопасность не обязательно UB, могут быть просто race conditions или исключения о неверном состоянии. При попытке вставить в один лист из двух потоков можно соснуть, как и в билдер.

                Представь себе вот такой класс
                class 1C {
                 private int debit;
                 private int credit;
                
                 void hujak(int n) {
                   debit += n;
                   credit -= n;
                 }
                // ну тут геттеры еще для кредита и дебета
                }

                Что будет, если хуяк вызвать из пяти потоков?
                Ответить
                • Я и спрашиваю какие багры могут быть конкретно с вышеперечисленными классами. Типа добавляешь объект в лист, а он не добавился?
                  Ответить
                  • У билдера ты передаешь вызываешь "append" из двух потоков, в это время в буфере кончается место, он делает ноывый буфер, копирует туда всё старое. В это время делает тоже самое другой поток. Один поток проебывает свою работу или падает с тупым исключением

                    С листом тоже самое примерно
                    Ответить
    • Решение: getDateFormat() возвращает каждый раз новый объект DateFormat
      Ответить
      • Всю жизнь так и делала. o_O
        Ответить
        • верните-ка мне еще один новый DateFormat
          Ответить
        • Только «делал».
          Ответить
        • Не пизди. Ты сначала был мальчиком. (будем честны, им и остался, так как смены пола не существует)
          Ответить
        • You will never be a real woman. You have no womb, you have no ovaries, you have no eggs. You are a homosexual man twisted by drugs and surgery into a crude mockery of nature’s perfection.
          All the “validation” you get is two-faced and half-hearted. Behind your back people mock you. Your parents are disgusted and ashamed of you, your “friends” laugh at your ghoulish appearance behind closed doors.
          Men are utterly repulsed by you. Thousands of years of evolution have allowed men to sniff out frauds with incredible efficiency. Even trannies who “pass” look uncanny and unnatural to a man. Your bone structure is a dead giveaway. And even if you manage to get a drunk guy home with you, he’ll turn tail and bolt the second he gets a whiff of your diseased, infected axe wound.
          You will never be happy. You wrench out a fake smile every single morning and tell yourself it’s going to be ok, but deep inside you feel the depression creeping up like a weed, ready to crush you under the unbearable weight.
          Eventually it’ll be too much to bear – you’ll buy a rope, tie a noose, put it around your neck, and plunge into the cold abyss. Your parents will find you, heartbroken but relieved that they no longer have to live with the unbearable shame and disappointment. They’ll bury you with a headstone marked with your birth name, and every passerby for the rest of eternity will know a man is buried there. Your body will decay and go back to the dust, and all that will remain of your legacy is a skeleton that is unmistakably male.
          This is your fate. This is what you chose. There is no turning back.
          Ответить
          • ого, целые сутки уже про трапы не говорили
            пора и справлять
            Ответить
            • Инью пытается пробить стену: вызвать «Люсидфокса» на флейм. Думаю, пустая затея: наверняка рассылка с ГК выключена или это мыло недействующее.
              Ответить
              • все понятно

                инью тоже решил с трапами дружить. последний нормальный тут былд
                Ответить
                • представьте себе
                  представьте себе

                  и с трапами дружил
                  Ответить
                  • > и с трампами дружил
                    Гологуб?
                    Ответить
                    • Артемий думал он кузнечик
                      А оказалось он говно
                      Хотя в лежал зелёный
                      Хотя и с мухами дружил
                      Ответить
                      • едешь, кися. ты же в обеспеченной, перспективной стране, чего тебе не хватает? или депрессия у тебя оттого, что не трахают?
                        Ответить
                • nugop-ы — наши лучшие друзья.
                  Ответить
                • сам ты трап
                  Ответить
      • Да, это даже лучше.
        Ответить
    • Хм..., насколько я знаю для этого существуют factory-методы и статические блоки.
      Ответить

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