Что такое синхронизация Java?
Содержание
В информатике поток представляет собой последовательность инструкций внутри программы, которые могут выполняться независимо от другого кода. Многие потоки могут запускаться одновременно внутри программы. Все Java-программы имеют по крайней мере один поток, известный как основной поток, который создается JVM при запуске программы, когда метод main() вызывается с основным потоком. Это объект, который имеет свои собственные регистры, стек и сегмент кода, которые могут работать параллельно с другими потоками процесса (процесс представляет собой набор потоков).
Что такое многопоточность?
Многопоточность - это процесс одновременного выполнения нескольких потоков. Это означает, что он использует два или более «потоков» выполнения, работающих вместе для выполнения задачи. Каждая последовательность команд имеет свой собственный уникальный поток управления, который не зависит от всех остальных.
Синхронизация в Java
В общем случае синхронизация используется для защиты доступа к ресурсам, к которым обращаются одновременно. Одним из преимуществ использования нескольких потоков в приложении является то, что каждый поток выполняется асинхронно. Существует много ситуаций, когда несколько потоков должны совместно использовать доступ к общим объектам. Например, в системе базы данных вам может не потребоваться, чтобы один поток обновлял запись базы данных, а другой поток пытался ее прочитать. В этих случаях мы должны гарантировать, что ресурс будет использоваться только по одному потоку за раз. В противном случае два или более потока могут получить доступ к одному и тому же ресурсу в одно и то же время, каждый не знает о действиях другого. Java позволяет вам координировать действия нескольких потоков с использованием синхронизированных методов и синхронизированных операторов. Доступ к объекту, для которого нужно координировать доступ, осуществляется посредством использования синхронизированных методов. Эти методы объявляются с ключевым словом synchronized. Только один синхронизированный метод может быть вызван для объекта в данный момент времени. Это позволяет синхронизировать методы в нескольких потоках от конфликта друг с другом. Ниже приведен общий вид синхронизированного оператора:
Синтаксис
synchronized(objectidentifier) { // Доступ к общим переменным и другим общим ресурсам }
Параметр objectidentifier является ссылкой на объект, блокировка которого связана с монитором, который представляет собой синхронизированный оператор. Язык программирования Java предоставляет две основные идиомы синхронизации: синхронизированные методы и синхронизированные операторы.
Что такое синхронизированные методы и синхронизированные операторы?
Синхронизированные методы позволяют простую стратегию предотвращения помех потоков и ошибок согласованности памяти: если объект виден более чем одному потоку, все считывания или записи в переменные этого объекта выполняются с помощью синхронизированных методов. Невозможно чередование двух вызовов синхронизированных методов на одном объекте. Когда один поток выполняет синхронизированный метод для объекта, все другие потоки, которые вызывают синхронизированные методы для одного и того же блока объектов (приостанавливают выполнение) до тех пор, пока первый поток не будет выполнен с объектом. Чтобы синхронизировать метод, просто добавьте синхронизированное ключевое слово в его объявление:
public synchronized void increament(){ count++; }
Синхронизированный блок
Синхронизирующий блок обеспечивает атомарность связки операторов кода. Если вам нужно синхронизировать доступ к объекту класса или вы хотите, чтобы часть метода была синхронизирована с объектом, вы можете использовать для него синхронизированный блок.
public void add(int value){ synchronized(this){ this.count += value; } }
Одно существенное различие между синхронизированным методом и блоком состоит в том, что Синхронизированный блок обычно уменьшает объем блокировки. Поскольку объем блокировки обратно пропорционален производительности, всегда лучше блокировать только критический раздел кода. Кроме того, синхронизированный блок может вызывать Java.lang.NullPointerException, если выражение, предоставленное блоку, как параметр, имеет значение null, что не соответствует синхронным методам.
Источник: http://net-informations.com/Java/cJava/synchronization.htm