Статья просто отличная, спасибо Как там с java.util.concurrent, будет что-нибудь в подобном духе?
Asylum29, у меня было такое предположение, Но на практике оно не подтвердилось, поэтому оставил всё, как есть. Так-то вы правы, я добавлю это в статью. Плюс за внимательность!
private static void printCounter() { while (Counter.get() < 5000) { synchronized (Counter.class) { for (int i = 0; i < 10; i++) { Counter.increment(); ... Вы берете объект в блокировку, но при этом вызов Counter.get() по-прежнему возможен. Это означает, что в конце работы алгоритма возможна ситуация гонок, когда один поток будет в цикле for выполнять инкремент в интервале [4990; 5000], а другой проверять в while текущее значение (и получить, например, 4998, что меньше 5000), после чего перейти к блоку синхронизации. Ну а далее, после освобождения блока синхронизации, добавить к 5000 еще 10.
Asylum29, где именно? Вроде написал, что из-за проблемы видимости объекта, поток не сразу получает реальное значение.
aNNiMON, объясните, пожалуйста, почему в первом примере с использованием synchronized (только для цикла for) Вы ничего не пишите про возможность получения значения 5010?
Вау, не знал про CopyOnWriteArrayList, интересно
#ждукогдавитёкначнётпилитьвидеоурокипояве
А с мобилки статья не кажется такой огромной
Блин, статья просто огромная, ее можно было бы наверное части на три разбить. И чего только основы? Если есть, о чем можно сообщить, лучше сделать это в виде дополнительной статьи, а в основной сделать ссылки на пояснения каких-то моментов
Спасибо большое! Очень полезно, жду продолжение! Java Категории |