Во-первых, обратите внимание, что ваш источник НЕ лучшее место для изучения того, что вы пытаетесь выучить.Вы будете хорошо читать статьи из ответа @blucz (а также его ответа в целом), даже если это выходит за рамки Java.Oracle Trails не являются плохими сами по себе, но они упрощают вопросы и затушевывают их, следовательно, вы можете обнаружить, что не понимаете, что вы только что узнали, или полезно это или нет, и сколько.
Теперь, пытаясь ответить в основном в контексте Java.
Вмешательство потока
происходит, когда операции потока чередуются , то есть смешиваются.Нам нужны два исполнителя (темы) и общие данные (место, чтобы вмешиваться).Изображение Daniel Stori, с сайта turnoff.us:
![Daniel Stori, turnoff.us](https://i.stack.imgur.com/JIhds.png)
На рисунке вы видите, что два потока в процессе GNU / Linux могут мешать каждомуДругой.Потоки Java - это, по сути, объекты Java, указывающие на собственные потоки, и они также могут создавать помехи друг другу, если работают с одними и теми же данными (например, здесь, где «Рик» портит данные - рисование - своего младшего брата).
Ошибки непротиворечивости памяти - MCE
Важнейшими моментами здесь являются видимость памяти, события до и, вызванные @blucz, аппаратными средствами.
MCE - это, очевидно, ситуации, когда память становится несовместимой.Что на самом деле является термином для людей - для компьютеров память постоянна во всех случаях (если она не повреждена).«Несоответствия» - это то, что люди «видят», потому что они не понимают, что именно произошло, и ожидали чего-то другого.«Почему это 1? Это должно быть 2?!»
Эта «кажущаяся непоследовательность», этот «пробел» относится к памяти видимость , то есть к каким разным потокам смотрите когда они смотрят на память.И поэтому, что эти потоки работают на .Видите ли, в то время как чтение и запись в память линейны, когда мы размышляем о коде (особенно когда думаем о том, как он выполняется построчно) ... на самом деле это не так.Особенно, когда речь идет о потоках.Итак, в учебнике, который вы прочитали, приведен пример увеличения счетчика на два потока и того, как поток 2 считывает то же значение, что и поток 1. Фактические причины несоответствий памяти могут быть связаны с оптимизацией кода, с помощью javac, JIT или аппаратного обеспечения.модель согласованности памяти (то есть что-то, что люди CPU сделали для ускорения своего CPU и повышения его эффективности).Эти оптимизации включают в себя предварительные хранилища, прогноз ветвления, и на данный момент вы можете думать о них как о переупорядочении кода, так что в итоге он будет работать быстрее и потреблять / тратить меньше процессорных циклов.Однако, чтобы убедиться, что оптимизация не выходит из-под контроля (или слишком далеко), сделаны некоторые гарантии.Эти гарантии формируют отношения «происходит до», где мы можем сказать, что до до этой точки и после, вещи «произошли до».Представьте, что вы устраиваете вечеринку и вспоминаете, что Том пришел сюда ДО Сьюзи, потому что вы знаете, что Роб пришел после Тома и до Сьюзи.Роб - это событие, которое вы используете, чтобы сформировать отношения до и после того, как придут события Тома / Сьюзи.
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility
Ссылка выше расскажет вам больше о видимости памяти и о том, что происходит.до отношений в Java.Это не будет сюрпризом, но:
- синхронизация
- запускает поток
- присоединение к потоку
- volatile ключевое слово говорит вам, чтозапись происходит до последующих чтений, то есть чтение ПОСЛЕ записи не будет переупорядочено, чтобы быть записью «до», поскольку это нарушит отношения «происходит до».
Поскольку все, что касается памятиаппаратное обеспечение имеет важное значение.Ваша платформа имеет свои собственные правила, и хотя JVM пытается сделать их универсальными, заставляя все платформы вести себя одинаково, только это означает, что на платформе A будет больше барьеров памяти, чем на платформе B.
Ваши вопросы
В чем разница между ошибками согласованности памяти и интерференцией потоков?MCE составляет около видимости памяти для программных потоков и НЕ имеет отношения случается-до между чтением и записью, поэтому имеет разрыв между тем, что люди считают «должно быть», и тем, что «на самом деле»is ".
Взаимодействие потоков связано с наложением, смешиванием, перемежением и касанием общих данных потоковых операций, вкручиванием их в процесс, что может привести к тому, что поток A получит хороший рисунок, уничтоженный потоком B.Вредный обычно помечает критический раздел, поэтому синхронизация работает.
Как отличается использование синхронизации, чтобы избежать их или нет?
Пожалуйста, прочитайте также о тонких замках, толстых замках и конфликтах нитей.Синхронизация, чтобы избежать вмешательства потока, делает это, заставляя только один поток обращаться к критическому разделу, другой поток блокируется (дорого, конфликт потоков).Когда дело доходит до MCE, синхронизация устанавливает, что происходит раньше, когда дело доходит до блокировки и разблокировки мьютекса, см. Более раннюю ссылку на описание пакета java.util.concurrent.
Для примеров: см. Оба предыдущих раздела.