LINUX.ORG.RU

подскажите - а как и насколько принципы использования тредов в Java отличаются от нормальных языков типа C?

 , ,


1

4

Мне интуиция подсказывает что суть таже и отличается не сильно но я довольно слаб в Java и хотелось бы знать мнение продвинутых джавистов.

Интересует исключительно в контексте Linux-а

★★★★★

Последнее исправление: stave (всего исправлений: 2)
Ответ на: комментарий от ilovewindows

переформулировал вопрос.

cvv ★★★★★
() автор топика

1) В Java очень строго и детально описаная модель памяти, работающая на любом железе одинаково. По крайней мере согласно правилам в тех местах где даются гарантии

2) Обычно треды используют где уверены что необходима постоянная работа этого треда. Но в 90% случаях все думают в терминах выполнения задач (task) паралельно. И запускают не треды, а просто отправляют Runnable или лямбду в ExecutorService. Это быстрее, дешевле, управляемее и короче

3) В Java очень много готовых примитивов, много из них lock-free. Лучше поискать готовую concurrent lock free структуру данных, чем lock с обычным Map. Лучше использовать готовые atomics или даже LongAdder, чем городить свой велосипед.

4) Для многих сценариев можно применить Fork-Join Pool - более умная абстракция для параллелизма, умеет предотвращать всякие голодания потоков, когда одна задача вроде-как блокирующе ждет другую

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 3)

на современных линуксах java-треды реализованы через нативные треды. На осях где нет своих тредов (н.р java 1.1+solaris) используются свои зеленые треды. На линуксах с NTPL все треды имею один process ID, но разные thread ID (поле LWP в выхлопе ps -eLf). На говне мамонта с linuxthreads они имеют разные process ID. Сам Thread емнип написан на C++ через JNI.

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

Ок. Это ближе к делу.

Ну вот скажем - а как обстоят дела с аффинити и подобным? Например игры с аффинити воможны или целесообразны?

А с инвалидацией и промахами кешей?

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

ни разу не пользовался, поэтому не буду отвечать ересь

а вот возьми и попробуй! и прям сюда результаты теста!

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

По пункту номер три. У меня есть, например ArrayList и HashSet. Треды работают и, на каждой внутренней итерации, сваливают туда данные. Работа с ними вынесена в одну единственную функцию, там три строчки, каждая работает только с этими коллекциями (вычесть из множества и добавить новые элементы), которая объявлена как synchronized. Профилировщик показывает, что блокировок тредов нет. Так делать глупо? Стоит писать на основании примитивов? В этом конкретном случае необходимо, чтобы все действия выполнялись последовательно и вклинивания из других тредов не происходило, так что примитивы мне, наверное, не помогут, но в общем случае примитивы лучше synchronized?

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

Спасибо - интересно

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

Если в рамках одной операции ArrayList и HashSet всегда модифицируются вместе, то наверное вариант с synchronized подойдет лучше всего. А если бы речь шла например только о HashSet, то тогда вместо полной блокировки имело бы смысл взять ConcurrentHashMap (для ArrayList — CopyOnWriteArrayList).

CARS ★★★★
()

В Java треды работают так, как написано в спецификации Java. На C нет спецификации на треды и всё работает так, как написано в мануале по твоему процессору.

В целом да, суть та же и отличается не сильно.

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

Ну вот скажем - а как обстоят дела с аффинити и подобным? Например игры с аффинити воможны или целесообразны?

возможны, но вроде нормальных библиотек для этого нет, целесообразность зависит от твоего алгоритма, естественно.

А с инвалидацией и промахами кешей?

а что с ними? можно как промахнуться, так и не промахнуться, зависит от алгоритма, в восьмой джаве добавили @Contended, если тебе это интересно.

maloi ★★★★★
()

а при чем здесь какие-то непонятные цыпы?

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

Из коробки средств для настройки thread affinity нет. Говорят это кому-то бывает нужно, но я не видел такого.

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

На C нет спецификации на треды

Начиная с С11, что-то есть

Gvidon ★★★★
()

отличается, и довольно сильно, лучше почитать книжку

shty ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.