Подтвердить что ты не робот

Threadsafe vs Synchronized

Я новичок в java. Я немного запутался между Threadsafe и синхронизирован. Thread safe означает, что метод или экземпляр класса могут использоваться несколькими потоками одновременно без каких-либо проблем. Где в качестве Синхронизированного означает, что только один поток может работать за один раз.

Итак, как они связаны друг с другом?

4b9b3361

Ответ 1

Определение безопасности потоков, приведенное в Java Concurrency на практике:

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

Например, объект java.text.SimpleDateFormat имеет внутреннее изменяемое состояние, которое изменяется, когда вызывается метод, который анализирует или форматирует. Если несколько потоков вызывают методы одного и того же объекта dateformat, есть вероятность, что поток может изменить состояние, необходимое другим потокам, в результате чего результаты, полученные некоторыми потоками, могут быть ошибочными. Возможность иметь внутреннее состояние повреждена, что приводит к плохой производительности, делает этот класс небезопасным.

Существует несколько способов решения этой проблемы. Вы можете иметь каждое место в своем приложении, которое требует, чтобы объект SimpleDateFormat создавал новый экземпляр каждый раз, когда он ему нужен, вы можете сделать ThreadLocal, содержащий объект SimpleDateFormat, чтобы каждый поток вашей программы мог получить доступ к своей собственной копии (так что каждый поток имеет только для его создания), вы можете использовать альтернативу SimpleDateFormat, которая не сохраняет состояние, или вы можете сделать блокировку с помощью synchronized, чтобы только один поток за один раз мог получить доступ к объекту dateFormat. Блокировка не обязательно является наилучшим подходом, поэтому лучше избегать совместного измененного состояния.

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

Ответ 2

Безопасность потоков - это желаемое поведение программы, где блок synchronized помогает вам достичь такого поведения. Существуют и другие методы обеспечения безопасности потоков, например, неизменяемый класс/объекты. Надеюсь, это поможет.

Ответ 3

Безопасность потока: программа, защищенная потоками, защищает данные от ошибок согласованности памяти. В многопоточной программе программа с потоковой безопасностью не вызывает никаких побочных эффектов с несколькими операциями чтения/записи из нескольких потоков на общие данные (объекты). Различные потоки могут совместно использовать и изменять данные объекта без ошибок согласованности.

synchronized - один из основных способов достижения кода ThreadSafe.

Для получения более подробной информации см. ниже вопросы SE:

Что означает "синхронизированный" ?

Вы можете добиться безопасности потоков, используя расширенный API concurrency. Эта документация страница предоставляет хорошие конструкторы программирования для обеспечения безопасности потоков.

Блокировать объекты поддерживают блокировки идиом, которые упрощают многие параллельные приложения.

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

Атомные переменные имеют функции, которые минимизируют синхронизацию и помогают избежать ошибок согласованности памяти.

ThreadLocalRandom (в JDK 7) обеспечивает эффективное генерирование псевдослучайных чисел из нескольких потоков.

Обратитесь к java.util.concurrent и java.util.concurrent.atomic для других программных конструкций.

Связанный вопрос SE:

Синхронизация и блокировка

Ответ 4

После терпеливого чтения через много ответов и не слишком технического в то же время я мог бы сказать что-то определенное, но близко к тому, что Nayak уже ответил на fastcodejava выше, что приходит позже в моем ответе, но посмотрите

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

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

Одним из способов достижения близости к безопасности потоков будет использование классов в java.util.concurrent.atomic.

Грустно, что у них нет окончательных методов!

Ответ 5

Наяк, когда мы объявляем метод как синхронизированный, все остальные вызовы к нему из других потоков блокируются и могут ждать неопределенно долго. Java также предоставляет другие средства блокировки с объектами Lock.

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

ref: http://www.javamex.com/tutorials/threads/thread_safety.shtml

Ответ 6

На практике эффективные по производительности, потокобезопасные, синхронизированные, не потоковые и несинхронизированные классы упорядочиваются следующим образом:

Hashtable(slower)  <  Collections.SynchronizedMap  <  HashMap(fastest)

Ответ 7

Синхронизировано: только один поток может работать в одно и то же время. Threadsafe: экземпляр метода или класса может использоваться несколькими потоками одновременно без каких-либо проблем. Если вы связываете этот вопрос так: Почему синхронизированные методы являются потокобезопасными? чем вы можете получить лучшую идею.

В соответствии с определением это кажется путаным. Но нет, если вы понимаете это аналитически.

Синхронизированное средство: последовательно поочередно в порядке, Не одновременно [Не в то же время]. синхронизированный метод не позволяет воздействовать на него другим потоком, хотя поток уже работает над ним. Это позволяет избежать concurrency. пример синхронизации: если вы хотите купить билет в кино и встать в очередь. вы получите билет только после того, как человек перед вами получит билет.

Безопасные потоки: метод становится безопасным для доступа несколькими потоками без каких-либо проблем одновременно. Синхронизированное ключевое слово является одним из способов достижения "потокобезопасности". Но помните: на самом деле, в то время как несколько потоков пытаются получить доступ к синхронизированному методу, они следуют порядку, поэтому становится безопасным для доступа. Фактически, даже они действуют одновременно, но не могут одновременно обращаться к одному ресурсу (методу/блоку) из-за синхронного поведения ресурса.

Потому что, если метод становится синхронизированным, это становится безопасным, позволяя нескольким потокам воздействовать на него без каких-либо проблем. Помните: несколько потоков " не действуют на него в то же время", поэтому мы называем синхронизированные методы потоками безопасными.

Надеюсь, это поможет понять.