Правильное понимание таких понятий, как volatile, syncronized и AtomicReference?

Я хотел бы убедиться, что я правильно понял эти понятия. Объяснения / подтверждения мне очень помогут, и я уверен, что многие другие программисты. Итак, вот мое понимание этих концепций, полученное в результате моего исследования:

  1. Volatile используется, когда вы хотите разделить переменную между несколькими потоками. а) Какая разница между объявлением переменной (разделяемой между потоками) volatile и не делать это? б) Должны ли мы всегда объявлять его изменчивым, если мы обращаемся к нему из разных потоков? в) Имеет ли смысл синхронизировать переменную?

  2. AtomicReference - это класс, который оборачивает наш объект и предоставляет некоторые атомарные операции над ним (compareAndSet, lazySet и weakCompareAndSet). Это все, нет синхронизации, нет ничего. а) Имеет ли смысл объявлять AtomicReference энергозависимым? б) Но синхронизировать это?, так как AtomicReference.get не синхронизируется ни набор?

  3. Синхронизация - это концепция, которая означает последовательный доступ к переменной, которая используется несколькими потоками. Это может быть сделано экземпляром и классом. Синхронизация может быть добавлена ​​в заголовки методов или в блоки кода. Надеюсь, здесь нет тайн:)

С уважением, Аврелиан

2 ответа

Решение

а) Какая разница между объявлением переменной (разделяемой между потоками) volatile и не делать это?

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

б) Должны ли мы всегда объявлять его изменчивым, если мы обращаемся к нему из разных потоков?

Если к нему всегда нет доступа из синхронизированного блока.

в) Имеет ли смысл синхронизировать переменную?

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

а) Имеет ли смысл объявлять AtomicReference энергозависимым?

Это определенно так, если вы планируете изменить экземпляр во время выполнения. Обычно, однако, лучше иметь final AtomicReference,

б) Но синхронизировать это?, так как AtomicReference.get не синхронизируется ни набор?

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

Volatile используется, когда вы хотите разделить переменную между несколькими потоками. а) Какая разница между объявлением переменной (разделяемой между потоками) volatile и не делать это? б) Должны ли мы всегда объявлять его изменчивым, если мы обращаемся к нему из разных потоков? в) Имеет ли смысл синхронизировать переменную?

Чтобы понять volatileПолезно подумать об архитектуре современного аппаратного обеспечения компьютерной системы.

Чтобы повысить производительность, КАЖДЫЙ ПРОЦЕССОР ИЛИ ЯДРО имеет свой собственный кэш локальной памяти. Данные, которые присутствуют в этом кэше, являются локальными для конкретного процессора и невидимы для других процессоров. Кроме того, могут быть кэши данных практически на любом уровне, вплоть до самой JVM.

Когда вы думаете о потоках таким образом, то есть о единицах выполнения, которые могут быть разделены между процессорами, легко понять очень важный факт модели памяти Java:

Нет гарантии, что изменения в общей переменной, сделанные в одном потоке, станут видимыми для других потоков, которые обращаются к той же переменной (без синхронизации).

Опять же, представьте, что данные, которые обновили совместно используемую переменную, по-прежнему находятся в кеше локального процессора, который недоступен другим ядрам (и, следовательно, поэтому недоступен другим выполняющимся на них потокам).

volatile Ключевое слово предоставляет вам способ гарантировать, что изменения общих переменных сразу же записываются в память, чтобы изменения, которые происходят с ними, были видны другим потокам. Volatile полезен в простых ситуациях, и хотя он обеспечивает улучшенную жизнеспособность данных, он не дает никаких гарантий атомарности и, следовательно, не может гарантировать, что условия гонки для общей переменной по-прежнему не возникнут.

Если для преобразования объекта из одного логического состояния в другое требуется несколько шагов, то синхронизация доступа к состоянию объекта становится необходимой для сохранения атомарности (либо обновление происходит полностью, либо вообще не происходит), даже если переход состояния включает только объявленные переменные volatile,

Другие вопросы по тегам