Обзор
Недавно я читал «Мысль в Java». и очень простые.
1. Volatile
Волатильный в основном используется для синхронизации переменных в многопользовании.
В целом, для улучшения производительности каждый поток сохранит переменную в основной памяти в качестве копии переменной в своей собственной памяти при запуске, но легко вызвать непоследовательные переменные реплики, сохраненные в нескольких потоках. переменное значение в основной памяти.
Когда переменная модифицируется летучкой, переменная не может быть кэширована в памяти потока. "." », Копия переменной области памяти, поэтому, когда переменная изменяется, все потоки, вызывающие переменную, получит одно и то же значение, что обеспечивает видимость переменной в приложении (когда задача изменена в приложении должна быть визуальной ), и производительность также была соответствующим образом снижена (хотя она выше, чем синхронизирован).
Тем не менее, следует отметить, что летучие может только гарантировать, что операция является одной и той же частью памяти, и не может гарантировать атомарность операции. Следовательно, нестабильный обычно используется для объявления простых переменных типа, так что эти переменные являются атомальными, то есть некоторые простые операции назначения и возврата будут гарантированы, что они не будут прерваны. Однако, когда значение переменной определяется по собственной предыдущей, роль нестабильной будет недействительной, которая определяется природой летучих ключевых слов.
Поэтому будьте осторожны, когда летучие.
2. Threadlocal
Прежде всего, Threadlocal не имеет копейки с локальным потоком, и это не специальный поток, это просто локальная переменная потока (на самом деле карта). использует переменную, поэтому каждый поток может независимо изменить свою собственную копию, не влияя на соответствующую копию на другие потоки. Это на самом деле способ обмена пространством на время (в отличие от синхронизации), что значительно снижает энергопотребление, вызванное синхронизацией потока (например, синхронизированный) и уменьшает сложность одновременного контроля потока за счет памяти.
Я лично считаю, что типичным примером является использование Threadlocal в исходном коде Android о Looper, который также включает в себя базовое использование Threadlocal.
Public Class Looper {Private Static Final String Tag = "Looper"; // sthreadlocal.get () вернет NULL, если вы не позвонили в Preceare (). Приватный статический Looper mmainlooper = null; sthreadlocal.set (new Looper ()); Looper) {mmainlooper = looper; ..}
Но следует отметить, что, хотя Threadlocal и Synconized используются для решения многопоточного одновременного доступа, все еще существует фундаментальная разница между нитолокальными и синхронизированными. Синхронизированный использует механизм блокировки, чтобы переменные или кодовые блоки могли быть доступны только одним потоком в определенное время. Threadlocal предоставляет копию переменной для каждого потока, так что каждый поток не доступ к одному и тому же объекту в определенное время, что изолирует обмен данными данных несколькими потоками. Синхронизированный противоположный, он используется для получения обмена данными при передаче между несколькими потоками. То есть синхронизированный используется для обмена данными между потоками, в то время как Threadlocal используется для выделения данных между потоками. Следовательно, Threadlocal не может заменить синхронизированный, а синхронизированный имеет более широкий диапазон функций (механизм синхронизации).
3. Синхронизированный
Синхронизированное ключевое слово автоматически реализуется Java с использованием механизма блокировки. Все объекты в Java автоматически содержат одну блокировку (также известную как мониторы). и до возвращения поток из этого метода, все остальные потоки в объекте, которые хотят вызвать метод, обозначенный синхронизированный в классе, будут заблокированы. Конечно, есть также блокировка для каждого класса (как часть объекта класса класса), так что вы знаете ^. ^.
Наконец, важно отметить, что синхронизированный является самым безопасным способом в механизме синхронизации.