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

    +78

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    public class LoadManager
    {
        public static Integer DEFAULT_MAX_LOAD_COUNTER = 2;
    
        private ConcurrentHashMap<Class, Integer> loadCounters = new ConcurrentHashMap<Class, Integer>();
    
        public void incLoadCounter(Class clazz)
        {
            synchronized (loadCounters)
            {
                if (!loadCounters.containsKey(clazz))
                {
                    loadCounters.put(clazz, 0);
                }
    
                if (loadCounters.get(clazz) <= DEFAULT_MAX_LOAD_COUNTER)
                {
                    loadCounters.put(clazz, loadCounters.get(clazz) + 1);
                }
            }
        }
    
        public void testLoadCounterAndWait(Class clazz)
        {
            synchronized (loadCounters)
            {
                if (!loadCounters.containsKey(clazz))
                {
                    loadCounters.put(clazz, 0);
                }
            }
            
            try
            {
                while (loadCounters.get(clazz) > DEFAULT_MAX_LOAD_COUNTER)
                {                
                    Thread.sleep(3000L + (long)Math.floor(5000 * Math.random()));
                }
            }
            catch (InterruptedException e) {}        
        }
    
        public void decLoadCounter(Class clazz)
        {
            synchronized (loadCounters)
            {
                if (!loadCounters.containsKey(clazz))
                {
                    loadCounters.put(clazz, 0);
                }
    
                if (loadCounters.get(clazz) > 0)
                {
                    loadCounters.put(clazz, loadCounters.get(clazz) - 1);
                }
            }
        }
    }

    Наверное, нужно было вот это: http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/Semaphore.html
    Ну и ещё порадовал способ постановки потоков в "очередь".

    Запостил: konsoletyper, 17 Августа 2011

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

    • еще ни одного плюса. странно... уже с десяток должно быть...
      Ответить
    • Да тут просто полный пиздец. Код нужно просто удалить. Ему уже ничем не помочь.
      Ответить
      • Ну да, мало того, что оно велосипед, так ещё и кривой велосипед. Класс даже не гарантирует, что будет не более DEFAULT_MAX_LOAD_COUNTER потоков, ибо увеличение счётчика и wait вынесены в отдельные методы. Хотя для той цели, для которой писали данного монстрика, оно не сильно критично
        Ответить
        • wait? вижу только sleep. Ещё очень впечатлило использование ConcurrentHashMap (как известно, имеющую внутренний механизм синхронизации) с явным synchronized. Видимо, автору просто понравилось название класса.
          Ответить
          • Я так понимаю, что на всякий случай, для надёжности. Чтобы уж наверняка работало. А wait - имеется в виду testLoadCounterAndWait. Просто в нормальном пряморуком семафоре не разделяют методы для ожидания и декремента, а тут они разнесены. Что чревато. А ещё меня сильно порадовал способ, которым ожидающие потоки ставятся в очередь. Причём, ещё и с рандомом :-)
            Ответить
          • ConcurrentHashMap ортогонален явному внешнему synchronized. ConcurrentHashMap гарантирует атомарность отдельных операций, внешний synchronized — что между последовательностью вызовов методов ConcurrentHashMap он не изменится в другом потоке.
            Ответить
            • Извиняюсь, за наглость, не могли бы вы посоветовать литературу по Java. Собираюсь диплом писать через год, а знакомых с данным ЯП среди знакомых нет, даже поговорить не с кем :D
              Ответить
              • Если интересно моё мнение, то для начала вот это очень неплохая книга по Java:
                http://www.ozon.ru/context/detail/id/3817476/
                Только опечаток в русском переводе много, а сама книга хороша.
                Ответить
              • Хм… Я, вообще-то, не настоящий жавист. Крутитесь на специализированных ресурсах, слушайте, наблюдайте, какие-то ссылки будут. Ищите сами. Отсеивайте ламеров.

                Мне лично, из жавовских книг понравилась Joshua Bloch, "Effective Java". Обязательна (после Complete Reference) для любого жависта, независимо от области деятельности. А дальше пойдёт более специализированная литература.
                Ответить
                • О, Блох... Это замечательная книга. Только она не совсем для начинающих. А так да, must read.
                  Ответить
                  • Блоха читаю уже второй день. Да, интересно. А крутиться на спец. ресурсах - как-то там не всегда адекватно =\
                    Ответить
              • Ну как, написал?
                Ответить
            • Это понятно. Просто в этой ситуации явно нужна не явная синхронизация, а putIfAbsent() и replace().
              Ответить
              • Ну, значит, не дочитал доку (если вообще заглядывал).
                Ответить
            • Он-то конечно ортогонален. Только вот здесь, учитывая, что всё равно все операции синхронизируются явно, атомарность отдельных операций в ConcurrentHashMap - как собаке пятая нога, при этом ещё и добавляет тормозов
              Ответить
              • Ну так там ещё и вне synchronized использование есть.
                Ответить
      • да тут только одна 3-я строка чего стоит (см. #7515 ) ;)
        Ответить
        • вот видите, какую хуйню пишут ваши "единомышленники"
          Ответить
          • Видать восприняли как руководство к действию. Бля...... )))))))))
            Ответить
    • Простыня...
      Ответить
    • Где дженерики?
      Ответить
    • показать все, что скрытоvanished
      Ответить

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