13

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

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

+0

@jtahlborn: «Все» - это * путь * завышение его. : P Требуется больше, чем просто синхронизация; требуется * согласованная * синхронизация. Если два потока, которые взаимодействуют с одним и тем же материалом, не синхронизируются с одним и тем же блокиром/монитором/мьютеком/независимо, то у вас есть много таких же проблем, как если бы они вообще не синхронизировались. – cHao

+0

@cHao - я обобщал. да, просто сбрасывая синхронизацию вокруг не делает ваш код потокобезопасным. как насчет «синхронизации является механизмом для обеспечения безопасности кода, но не все поточно-безопасные коды используют синхронизацию». – jtahlborn

+0

, если код синхронизирован, то как он будет использоваться несколькими потоками (в соответствии с потоками)? – Nayak

ответ

6

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

+8

Поскольку мы знаем, что все синхронизированный код является treadsafe, то как Threadsafe определяет метод или экземпляр класса, может использоваться несколькими потоками одновременно без каких-либо проблем. – Nayak

+0

Я знаю, немного устарел, но я хотел бы добавить комментарий, потокобезопасное поведение не перехватывает нормальную работу, что связано с значением переменных. синхронизация блокирует множественный доступ к одному и тому же объекту совместного доступа для достижения этого, например. некоторые статические классы или другие методы, такие как ввод шаблонов и создание новых экземпляров для каждого потока и т. д. – PSo

0

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

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

исх: http://www.javamex.com/tutorials/threads/thread_safety.shtml

8

Определение безопасности потока приведены в Java Concurrency in Practice является:

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

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

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

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

1

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

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

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

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

Печально, что у них нет final методов, хотя!

2

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

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

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

What does 'synchronized' mean?

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

Lock Objects Поддержка блокировки идиом, которые упрощают многие одновременные приложения.

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

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

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

См. Также java.util.concurrent и java.util.concurrent.atomic упаковки для других конструкций программирования.

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

Synchronization vs Lock

0

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

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

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

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

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

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

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

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