LINUX.ORG.RU

Опрос: что бы такое запилить, чтобы там было concurrency

 , ,


3

5

Я хочу наскрести на свою задницу проблем, и организовать домашний проект, чуть менее чем полностью состоящий из проблем в многопоточности Java. Там должен твориться реальный ад и свинец. Для обеспечения работоспособности себя подходят любые средства, включая модификацию openjdk.

Есть какие-нибудь идеи, что это может быть?
Желательно так, чтобы это еще и имело некую иллюзию смысла, потому что пилить совсем уж бессмысленную фигню будет муторно.

Цель: разобраться как в Java работает concurrency. Позадрачивать низкоуровневый перфоманс и байтоёбство. Как сказал один хороший человек - «писать код, много кода. Писать тесты, много тестов. Читать спеку до посинения, и труды, которые эту спеку интерпретируют».

Проблема в том, что в java web мире concurrency почти не встречается, а все проблемы с concurrency обычно решаются его решительным выпиливанием. Поэтому чтобы прошарить в теме недостаточно просто прийти на работу и собрать хлебальником все грабли - у нас их просто нет. А надо наскрести!

Что подскажет хайвмайнд?
С меня как всегда - ничего :)
Спасибо

★★★★☆

Последнее исправление: stevejobs (всего исправлений: 1)

любое кластерное приложение, например обертка над jdbc которая позволяет совокупить пару тройку серверов бд и хоть както обеспечить консистентность в итоге

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Почини karaf. Там всё очень плохо и именно с мультитредингом. Как мне говорили люди, контрибьютившие в него: даже водка не помогает понять как это говно работает.

Hater ★★
()

Цель: разобраться как в Java работает concurrency.

Зачем? Можно же взять Clojure, например, и избавится сразу от кучи проблем :)

Debasher ★★★★★
()
Ответ на: комментарий от Hater

а что там конкретно плохо? Я им сам не пользовался, только читал. Вроде, оно типа расширенного OSGi контейнера. Значит треды там работают тупо как и во всей остальной джаве: ты сам их запускаешь, управляешь, убиваешь тредпулы. И когда ты накосячил, OSGi никак не поможет, потому что это не его зона ответственности. Нет?

stevejobs ★★★★☆
() автор топика

проблем в многопоточности Java

А что, помимо классических проблем многопоточности в Java есть ещё свои специфические? Энтерпрайз-класса?

Да и вообще, по-моему, проблемы с многопоточностью - от кривых рук программиста приложения. Следуйте общеизвестным правилам, которые расписаны везде и на все лады, и проблем не будет. Поэтому, пока вы, автор, не наг-нокодите, проблем с многопоточностью и не будет.

Andrey_Utkin ★★
()
Ответ на: комментарий от Andrey_Utkin

Согласен. Проблем особо не наблюдал. Есть зато некоторые недостатки. Например, тред в яве нельзя просто остановить (deprecated). Его можно только вежливо попросить остановиться, что он может захотеть сделать совсем не сразу. Еще все эти try-catch на любой чих с тредом, даже спать и ждать просто так нельзя, ибо тред в любой момент может проснуться, потянуться и сделать много ненужной работы. Еще volatile в яве непойми как работает. Я даже не уверен, работает ли вообще.

unt1tled ★★★★
()
Ответ на: комментарий от Andrey_Utkin

Касательно целеполагания

Все это нужно не для высокоуровневых прикладных задач, а для изучения внутренностей работы JVM. Зачем? Хочу. Есть голубая мечта - перестать заниматься всякой высокоуровневой фигней, и спокойно писать тулзы для программистов, желательно какую-нибудь VM. JVM лучшее что сейчас есть, поэтому логично ковырять её. А многопоточность - это интересная предметная область, которая имеет не только теоретический смысл, но и в принципе может приносить деньги

Что касается «нет проблем»...

вот просто открываешь «what's new in jdk 8», а там сразу:

  • Classes and interfaces have been added to the java.util.concurrent package.
  • Methods have been added to the java.util.concurrent.ConcurrentHashMap class to support aggregate operations based on the newly added streams facility and lambda expressions.
  • Classes have been added to the java.util.concurrent.atomic package to support scalable updatable variables.
  • Methods have been added to the java.util.concurrent.ForkJoinPool class to support a common pool.
  • The java.util.concurrent.locks.StampedLock class has been added to provide a capability-based lock with three modes for controlling read/write access.

Ну как, нет проблем? А ведь это то, что прямо на поверхности лежит. А там внутри плавает еще множество интересностей. Сейчас выходит девятка, там набралось еще больше ништяков.

Лежащий на поверхности метод изучения - просто читать код openjdk и пытаться его понять. Я начинал много раз, как курильщик бросает, заводил в /development вопросы «как изучать openjdk», и в конце концов пришел к выводу что вне контекста какой-то предметной задачи изучение такого объема информации недоступно вообще никому. Даже если поставить себе задачу «за два года составить техническую карту», то за это время элементарно очень многое поменяется. Плюс без комментариев автора там зачастую не понятно вообще ничего.

Поэтому сейчас нужно выбрать какую-то конкретную область, и писать код, много кода. Отсюда и вопрос.

А то что можно притащить Скалу, Акку и Кложур и, используя «общепризнанные правила, которые расписаны везде» продолжать писать свои круды с веб-интерфейсом - это рассуждение конечно здравое, но как бы так сказать... леденящее душу унынием. Круды можно и на работе за деньги пописать, нафиг-нафиг...

stevejobs ★★★★☆
() автор топика

Насколько понимаю, при написании краулеров для интернета много где нужна многопоточность.

php-coder ★★★★★
()
Ответ на: комментарий от unt1tled

Еще volatile в яве непойми как работает.

что конкретно непонятно в том, как работает volatile?

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

так это не на джаве же, а ты сделай на джаве лучше

umren ★★★★★
()

Напиши локальный кеш, который берет стейт из бд и умеет уведомлять другие интстансы кеша о новом значении и перезапрашивать из бд, если апдейт просрался.

dizza ★★★★★
()
Ответ на: комментарий от stevejobs

Ну так может, вам лучше писать код _в_ JDK, а не _под_ него? Аналогично, если хочется заниматься ядром Linux, то код ядра/драйверов писать и надо, а написание программ для Linux тут пользы мало будет приносить.

Вот вы привели список свежих доработок JDK, вот станьте автором новых, востребованных, но ещё не реализованных фич. Вроде есть опенсорсные реализации JDK, вот туда комитьте.

Andrey_Utkin ★★
()

Напиши миниатюрный HTTP/2 сервер :-)

anonymous
()
Ответ на: комментарий от stevejobs

спокойно писать тулзы для программистов, желательно какую-нибудь VM

Нахера программистам какая-то там VM?

loz ★★★★★
()

Стиви, а это какой по счету проект, который ты собираешься предпринять?

tailgunner ★★★★★
()

Накуа? Нет чтобы либы полезные либы пилить, там веб-фреймворк нормальный сделать, а то одни ущербности от хипсетров типа всяких ангуларов два ноль. Или опять же для доступа к БД либо всякие монстры в виде hibernate, либо поделия от хипстеров типа jooq и недоделки типа sql2o.

А на своей коробке под столом все равно не найдешь пограничных случаев. А хочешь найти пограничные случаи устаривайся в гугл, фейсбук, порнохаб, яндекс, вконтактик, одноклассники и т.д.

Но и там тебе не сразу дадут залезть в кишки. Так что еще как вариант сделай свой мировой стартап с блек джеком и шлюхами.

Можешь еще попробовать открыть гитхаб всяких hadoop-ов и начать потихоньку править баги. Через какое-то время может быстрее получишь доступ к кишкам какого-нибудь твитора, яху и прочих умирающих стартапчиков.

foror ★★★★★
()

мессадж-брокер напиши, желательно горизонтально масштабируемый.

не обязательно реализующий AMQP, или копирующий API Kafka, но что-нибудь наподобие.

lovesan ★★★
()

Также варианты: свой веб-сервер, свой MVC фреймворк, итд

lovesan ★★★
()

Также можно попробовать написать реализацию TPL(C#-овые Task итд)

lovesan ★★★
()

Посмотри Jenkins, оно монолитное, с вебом (свой фреймворк) с потоками (потому что один процесс и job-ы пускает и веб обрабатывает) и синхронизацией. Плагинов - туча. Багов - туча, правь не хочу.

Goganchic ★★
()
Ответ на: комментарий от php-coder

Довольно примитивная на мой взгляд. Тред пул из воркеров, тащащих данные и запись напарсенного либо в db либо еще куда.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Значит треды там работают тупо как и во всей остальной джаве: ты сам их запускаешь, управляешь, убиваешь тредпулы.

Там поломаный в хлам механизм контроля жизненного цикла сервисов, особенно разрешение зависимостей и определение порядка их старта и рестарта. Уже несколько лет не могут починить.

Hater ★★
()

Позадрачивать низкоуровневый перфоманс и байтоёбство.

Тебе найти java-тред где ты отзывался о байтодро**рах, мягко говоря, не лестно? Отчего вдруг, ты решил свое мнение изменить?

znenyegvkby
()
Последнее исправление: znenyegvkby (всего исправлений: 1)
Ответ на: комментарий от Andrey_Utkin

проблемы с многопоточностью - от кривых рук программиста приложения

Золотые слова, золотая голова... золотые часы!

znenyegvkby
()

Проблема в том, что в java web мире concurrency почти не встречается,

ппф. легка! начти оптимизировать свои веб-приложения по потреблению памяти.

darkenshvein ★★★★★
()

Была у меня заходная задача на senior engineer - перемножить две матрицы в n потоков. Никто так и не сделал из кандидатов.

Ну и читать спеку до понимания, что безопасный многопоточный код писать просто, если не стараться выжимать максимум производительности.

dzidzitop ★★
()

Напиши многопоточный парсер JSON.

Legioner ★★★★★
()

Можешь попробовать реализовать различные коллекции для многопоточного использования (map, set, producer-consumer и т.д.) При этом по максимуму использовать lock-free алгоритмы.

anonymous
()
Ответ на: комментарий от unt1tled

Согласен. Проблем особо не наблюдал. Есть зато некоторые недостатки. Например, тред в яве нельзя просто остановить (deprecated). Его можно только вежливо попросить остановиться, что он может захотеть сделать совсем не сразу.

Что значит нельзя? Можно. Да, deprecated, но метод есть и никуда не денется.

Еще все эти try-catch на любой чих с тредом, даже спать и ждать просто так нельзя, ибо тред в любой момент может проснуться, потянуться и сделать много ненужной работы.

В любой момент не может, только если ты ему самостоятельно сделаешь interrupt из другого треда.

Еще volatile в яве непойми как работает. Я даже не уверен, работает ли вообще.

Не уверен — разберись. Работает как положено.

Legioner ★★★★★
()
Ответ на: комментарий от Andrey_Utkin

Вот вы привели список свежих доработок JDK, вот станьте автором новых, востребованных, но ещё не реализованных фич. Вроде есть опенсорсные реализации JDK, вот туда комитьте.

Потоки не доработаешь без ныряния в JVM, а явовский JVM на плюсцах, а плюсцы он хейтит. Замкнутый круг получается.

EXL ★★★★★
()
Ответ на: комментарий от lovesan

Можешь рассказать это тем людям, которые меня к ним допускают. А когда на вопрос, «что такое Java Memory Model?» у меня переспрашивает кандидат «Жава мэмори модуль?» или рассказывают про GC с поколениями, то это супер.

В любом случае - если переварить JMM на уровне «уметь рассказать про неё в паре десятков фраз» и начать видеть в коде то, что там должно быть, но по факту нет, то проблем с многопоточностью не будет.

dzidzitop ★★
()
Ответ на: комментарий от Legioner

В любой момент не может

Notify в тред может придти и сам, так называемое ложное пробуждение (spurious wakeup), но использовать wait/notify в 2016 году нет причин. А вот в interrupted вывалиться без причины не должен, да.

Weres ★★★
()

Почини этот баг, например. И вообще, найди проект, который тебе интересен и чини незакрытые баги, связанные с многопоточностью.

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.