|
|
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
no56892PS. А зачем делать бесконечные циклы без sleep(1)? У вас же загрука ЦП 100% тогдаА зачем замедлять работу программы? Дали шанс выполниться другим потокам - и ладушки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 17:07 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
no56892 , Вы сути не уловили. Цикл здесь стоит для того, что бы показать, что второй поток не видит изменений первого неограниченно долгое время. Как вы можете объяснить причину этого? Почему я читаю переменную вновь и вновь, но не вижу в ней 1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 17:08 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
DEVcoachBasil A. SidorovЧто-то плохо соображаю.Контрольное чтение через Unsafe в s0 показывает, что поток не видит изменения значения, независимо от того, что там с условием цикла. Теперь осталось обьяснить почему изменения control в одном потоке видны в другом, a s нет, даже есть поставить s++ во второй цикл, ведь s и control ничем не отличаются, за исключением s в условии цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 17:11 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
Чуть модифицировал: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 17:24 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
Ну, давайте я попробую объяснить! Мне ж ещё по собеседованиям ходить.. ))) Multithreading - параллельное, или псевдопараллельное (если всего один процессор) выполнение разного или одинакового кода в потоках операционной системы. Потоки отличаются от процессов тем, что выполняются в пределах одного адресного пространства памяти, выделенного на процесс. Concurrency - один из способов синхронизации работы потоков, для согласования работы с общими данными, к которым обращается код из потоков. Вообще, весь этот способ стал актуальным с появлением многопроцессорных машин, а возможен стал благодаря появлению, сначала на RISC-овых процессорах, затем на x86 (кажется начиная с 586, или иначе "пентиум"), команды процессора casa и cmpxchg соответственно - или иначе CAS (compare-and-swap). Это атомарная операция. Атомарность гарантируется тем, что после считывания данных из ячейки памяти не освобождается шина данных, а сначала происходит сравнение, изменилось ли содержимое ячейки памяти. Другой способ обеспечить эксклюзивный доступ к общей памяти - synchronizing - основан на использовании мьютексов операционной системы, и заключается фактически к установке последовательного, поочередного выполнения участков синхронизированного кода. Когда код входит в синхронизированный блок кода, он проверяет мьютекс, и если он установлен, то ждет освобождения. На "несильно параллельных" многопоточных приложениях можно обеспечить эксклюзивный доступ к данным, и избежать ситуаций гонки, с помощью объявления совместно используемых переменных с ключевым словом volatile - в ряде случаев этого может оказаться достаточно. Часто используется совместно с синхронизацией. Объявление переменной с ключевым словом volatile гарантирует, что при модификации данных, значение будет записываться непосредственно в память, а не в кэш. Вот вкратце.. Вопросы? ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 09:53 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
mesier , Откровенно говоря, буквально каждое предложение неверно :-) Попозже отвечу, когда время будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 09:58 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
DEVcoach, ой ли? Может это вы неправильно понимаете что-то? ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 10:18 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
mesierMultithreading - параллельное, или псевдопараллельное (если всего один процессор) выполнение разного или одинакового кода в потоках операционной системы. Потоки отличаются от процессов тем, что выполняются в пределах одного адресного пространства памяти, выделенного на процесс.Да. mesierConcurrency - один из способов синхронизации работы потоков, для согласования работы с общими данными, к которым обращается код из потоков.Нет. Канкарренси - это общение потоков в целом. Она не предполагает обязательную согласованность данных. Например, вы можете встретить намеренную несогласованность данных (data races) в классах java.util.concurrent (AbstractQueuedSynchronizer, ConcurrentHashMap, etc.). Но наличие этих несогласованностей не делает этот код "не конкурентным". Он еще какой конкурентный :-) mesierВообще, весь этот способ стал актуальным с появлением многопроцессорных машинНет. Если говорить конкретно про проблемы согласованности данных, то они возникают и на однопроцессорных машинах благодаря оптимизациям JIT-компиляторов. Так что суди о актуальности этой проблемы по количеству процессоров - неверно. mesierВообще, весь этот способ стал актуальным с появлением многопроцессорных машин, а возможен стал благодаря появлению, сначала на RISC-овых процессорах, затем на x86 (кажется начиная с 586, или иначе "пентиум"), команды процессора casa и cmpxchg соответственно - или иначе CAS (compare-and-swap). Это атомарная операция. Атомарность гарантируется тем, что после считывания данных из ячейки памяти не освобождается шина данных, а сначала происходит сравнение, изменилось ли содержимое ячейки памяти.Нет. Разграничивать работу кода можно и без атомарных операций. Например, см. алгоритм Петерсона, для его корректной работы на современных процессорах достаточно обычного volatile. Более того, не все арзитектуры имеют CAS в принципе. На некоторых реализован другой подход - LLSC, обладающий своими преимуществами. Например, отсутсвием ABA-проблемы. В любом случае, псиать конкурентных код можно и без CASов. mesierДругой способ обеспечить эксклюзивный доступ к общей памяти - synchronizing - основан на использовании мьютексов операционной системы, и заключается фактически к установке последовательного, поочередного выполнения участков синхронизированного кода. Когда код входит в синхронизированный блок кода, он проверяет мьютекс, и если он установлен, то ждет освобождения.Если вы про ключевое слово synchornized, то неверно. Прежде, чем Java обратится к ОС за помощью она предпримет огромное количество действий, что бы этого избежать. Почитайте про thin и fat мониторы, и про biasing. Именно факт того, что в отсутствие contention synchronized не лезет в ОС делает его самым быстрым решением среди всех остальных других. А в присутствии contention он начинает проигрывать ReentrantLock. mesierНа "несильно параллельных" многопоточных приложениях можно обеспечить эксклюзивный доступ к данным, и избежать ситуаций гонки, с помощью объявления совместно используемых переменных с ключевым словом volatile - в ряде случаев этого может оказаться достаточно.Нет. volatile не обеспечивает эксклюизвный доступ к памяти. Она лишь обеспечивает видимость изменений между потоками с помощью барьеров памяти. Таким образом, volatile синхронизирует состояние памяти между потоками, но не синхронизирует порядок доступа к памяти этими потоками. mesierОбъявление переменной с ключевым словом volatile гарантирует, что при модификации данных, значение будет записываться непосредственно в память, а не в кэш.Нет, об этом я уже писал выше. volatile никак не влияет на расположение объектов в кэше. Кэшируется абсолютно все. volatile накладывет ограничение на то, какие оптимизации можно проводить с переменной. Например, как я уже писал выше, ее нельзя кэшировать в регистре. Нельзя игнорировать ее чтения. И т.д.. А JIT очень любит заниматься такой ерундой :-) Поэтому, volatile чтение медленнее обычного чтения не потому, что "переменной нет в кэше, и ее долго читать из памяти". Она есть в кэше. А потому, что JIT не имеет права применять к ней свои оптимизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 10:47 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
DEVcoach, Тогда и про control и s обьясните, в чем отличие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 10:52 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
DEVcoach, ну, теперь я вижу, что "на верхнем уровне абстракции" я всё-таки правильно рассказал. Вам просто до%%%ться захотелось.. )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 11:00 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
0FDТогда и про control и s обьясните, в чем отличие.Мой ответ такой - я не знаю, почему второй поток не видит s = 1 :-) Самый лучший способ достоверно это узнать - обратиться к Шипилеву/Куксенко/Иванову/Дагу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 11:03 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
mesierDEVcoach, ну, теперь я вижу, что "на верхнем уровне абстракции" я всё-таки правильно рассказал. Вам просто до%%%ться захотелось.. ))Ну если: 1) Сказать, что volatile не кэшируются, хотя они кэшируются; 2) Сказать, что volatile обеспечивает эксклюзивный доступ к данным, хотя она не делает этого; 3) Сказать, что конкарренси возможна только при наличии CAS, хотя это не так; и т.д. это по-вашему "до@баться к мелочам", то пусть будет так :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 11:06 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
DEVcoach0FDТогда и про control и s обьясните, в чем отличие.Мой ответ такой - я не знаю, почему второй поток не видит s = 1 :-) Самый лучший способ достоверно это узнать - обратиться к Шипилеву/Куксенко/Иванову/Дагу. Про s=1 понятно, я про control почему изменения control в одном потоке, видны другому, в отличии от s. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 11:10 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
DEVcoachmesierDEVcoach, ну, теперь я вижу, что "на верхнем уровне абстракции" я всё-таки правильно рассказал. Вам просто до%%%ться захотелось.. ))Ну если: 1) Сказать, что volatile не кэшируются, хотя они кэшируются; 2) Сказать, что volatile обеспечивает эксклюзивный доступ к данным, хотя она не делает этого; 3) Сказать, что конкарренси возможна только при наличии CAS, хотя это не так; и т.д. это по-вашему "до@баться к мелочам", то пусть будет так :-) Именно так, дои%%ться!. Я объяснил "на байтах" зачем нужен Concurrency, и очень кратко его основы, а не "только при наличии CAS". А вы ТСу хоть чем-нибудь помогли или только голову заморочили? Кстати, ещё я не говорил слов "только" и "к мелочам", читайте, пожалуйста, внимательнее. Человек вообще спросил о базовых понятиях.. А вы ему про Biased Locking.. ))) Разберётся, когда понадобится. Ибо "Я слышу, и забываю. Я вижу и запоминаю. Я делаю и понимаю", как-то так.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 11:31 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
mesierDEVcoachпропущено... Ну если: 1) Сказать, что volatile не кэшируются, хотя они кэшируются; 2) Сказать, что volatile обеспечивает эксклюзивный доступ к данным, хотя она не делает этого; 3) Сказать, что конкарренси возможна только при наличии CAS, хотя это не так; и т.д. это по-вашему "до@баться к мелочам", то пусть будет так :-) Именно так, дои%%ться!. Я объяснил "на байтах" зачем нужен Concurrency, и очень кратко его основы, а не "только при наличии CAS". А вы ТСу хоть чем-нибудь помогли или только голову заморочили? Кстати, ещё я не говорил слов "только" и "к мелочам", читайте, пожалуйста, внимательнее. Человек вообще спросил о базовых понятиях.. А вы ему про Biased Locking.. ))) Разберётся, когда понадобится. Ибо "Я слышу, и забываю. Я вижу и запоминаю. Я делаю и понимаю", как-то так.. В этот раз соглашусь со свеномом, многопоточность сложная тема, и именно в деталях и терминах кроется дьявол. Так как примногопоточном программировании ошибку допустить проще простого, как раз таки понимание этих деталей и рулит. Не буду утверждать что я сам гуру, но множество приведенных вами неточностей позволяет сделать вывод про уровень ваших знаний, да, я бы взял вас в команду писать код, который просто работает в разных потоках, но я бы не взял вас в команду по написанию чего-то нового и нешаблонного(пока что). Вообще многопоточность такая штука, в которой просто необходима практика, практика и еще раз практика, а лучше всего пяток пофикшенных гейзенбагов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 12:04 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
mesierВообще, весь этот способ стал актуальным с появлением многопроцессорных машин, а возможен стал благодаря появлению, сначала на RISC-овых процессорах, затем на x86 (кажется начиная с 586, или иначе "пентиум"), команды процессора casa и cmpxchg соответственно - или иначе CAS (compare-and-swap). Вообще-то мгопоточность программировали ещё на 8086 процессоре (даже не 80186 и тем более задолго до появления 80286). CAS-операций в 8086 как известно нет. Как же они делали это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 12:15 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
0FDПро s=1 понятно, я про control почему изменения control в одном потоке, видны другому, в отличии от s.x86 достаточно консервативна в возможных реордерингах на железном уровне: TSO. Поэтому по-хорошему за редким ислключением все должны видеть всех. Поэтому я склонен винить в "невидимости" s JIT, а не железо. Судя по всему, он не посчитал нужным записать новое значение s в память. Но это только догадка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 12:15 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
DEVcoach, Пришлось читать jls Если добавить System.out.println : Код: java 1. 2. 3. 4. читается s=1, цикл заканчивается Получается System.out.println является Synchronization actions которое заставляет читать s=1, такое Synchronization actions заставляет читать counter в другом потоке. Первым Synchronization actions является Thread.start, и во второй поток считывается s=0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 12:17 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
DEVcoachmesierНа "несильно параллельных" многопоточных приложениях можно обеспечить эксклюзивный доступ к данным, и избежать ситуаций гонки, с помощью объявления совместно используемых переменных с ключевым словом volatile - в ряде случаев этого может оказаться достаточно.Нет. volatile не обеспечивает эксклюизвный доступ к памяти. Она лишь обеспечивает видимость изменений между потоками с помощью барьеров памяти. Таким образом, volatile синхронизирует состояние памяти между потоками, но не синхронизирует порядок доступа к памяти этими потоками. По-моему mesier имеет ввиду, что операция записи значения в volatile переменную гарантировано атомарная (например запись в не-volatile поле типа long не обязательно атомарна, т.е. возможна ситуация, что другой поток увидит наполовину старое/наполовину изменённое значение) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 12:23 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
0FDПолучается System.out.println является Synchronization actions Несогласен с формулировкой, просто JIT выключает свои оптимизации, потому что видит что считанная переменная используется далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 12:26 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
забыл ник0FDПолучается System.out.println является Synchronization actions Несогласен с формулировкой, просто JIT выключает свои оптимизации, потому что видит что считанная переменная используется далее. Да и без sysout , s используется далее Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 12:31 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
0FDПолучается System.out.println является Synchronization actions которое заставляет читать s=1, такое Synchronization actions заставляет читать counter в другом потоке. Первым Synchronization actions является Thread.start, и во второй поток считывается s=0Нет. Вы сейчас пытаетесь объяснить это, основываясь на ваших знаниях работы Java. Но вы не учитываете то, что много чего еще не знаете. Вернее, если быть точным, вы пытаетесь подогнять ваши знания под наблюдаемое поведение. Так лучше не делать. sout не является synchronization action. Но это как минимум системный вызов, который обращается к ядру операционки, порождает context switch, и т.д.. В процессе этой сложной последовательности действий каким-то образом данные между потоками всетаки синхронизируются. Но почему это происходит - большой вопрос. Поэтому нельзя сказать, что sout это synchronization action. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 12:38 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
DEVcoach0FDПолучается System.out.println является Synchronization actions которое заставляет читать s=1, такое Synchronization actions заставляет читать counter в другом потоке. Первым Synchronization actions является Thread.start, и во второй поток считывается s=0Нет. Вы сейчас пытаетесь объяснить это, основываясь на ваших знаниях работы Java. Но вы не учитываете то, что много чего еще не знаете. Вернее, если быть точным, вы пытаетесь подогнять ваши знания под наблюдаемое поведение. Так лучше не делать. sout не является synchronization action. Но это как минимум системный вызов, который обращается к ядру операционки, порождает context switch, и т.д.. В процессе этой сложной последовательности действий каким-то образом данные между потоками всетаки синхронизируются. Но почему это происходит - большой вопрос. Поэтому нельзя сказать, что sout это synchronization action. Это Вы хорошо написали о моих знаниях и наблюдениях. Посмотрите PrintStream.println(тот же sysout) Код: java 1. 2. 3. 4. 5. 6. и jls 17.4.2 Actions Synchronization actions, which are: Volatile read. A volatile read of a variable. Volatile write. A volatile write of a variable. Lock. Locking a monitor <------------------------------- Unlock. Unlocking a monitor. The (synthetic) first and last action of a thread Actions that start a thread or detect that a thread has terminated, as described in §17.4.4. и после этого System.out.println не Synchronization actions? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 12:50 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
0FD , Вы меня неправильно поняли :-) Под "много чего не знаете", я имел ввиду в первую очередь внутреннее устройство операционки, железа, и прочих низкоуровневых вещей. Говоря "вы много чего не знаете", я не претендую на то, что я это знаю. Вы привели в пример sout, и смогли найти этому объяснение. Отлично. Но во-первых, это не полное объяснение, т.к. с точки зрения JMM в этом случае есть acquire в читающем потоке, но нет release в пишущем. Во-вторых, есть масса других способ заставить этот поток увидеть s=1. Например, как уже приводили выше пример, с помощью Thread.yield(). Как вы объясните, что видимость появляется в этом случае? Это нативный метод, к synchronization action не относится ... а видимость дает? Наконец, к synchronization action относят только то, что указано в JMM, базовые кирпичики. Все, что свыше - это не новые sync actions, а лишь надстройки над имеющимися. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 14:53 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38616113&tid=2126936]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
180ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
97ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 570ms |

| 0 / 0 |
