Что такое ключевое слово synchronized?
blockquote>Потоки передаются в основном путем совместного доступа к полям и полям ссылок объектов. Эта форма коммуникации чрезвычайно эффективна, но допускает два типа ошибок: помехи потоков и ошибки согласованности памяти . Инструмент, необходимый для предотвращения этих ошибок, - это синхронизация.
Синхронизированные блоки или методы предотвращают взаимодействие потоков и обеспечивают согласованность данных. В любой момент времени только один поток может получить доступ к синхронизированному блоку или методу ( критический раздел ) путем приобретения блокировки. Другие потоки ждут освобождения блокировки для доступа к критическому разделу .
Когда синхронизируются методы?
blockquote>Методы синхронизируются при добавлении
synchronized
в определение или объявление метода. Вы также можете синхронизировать определенный блок кода с помощью метода.Что означает про грамматически и логически?
blockquote>Это означает, что только один поток может получить доступ к критическому разделу , приобретя замок. Если этот поток не освободит эту блокировку, все остальные нити (ы) придется ждать, чтобы получить блокировку. У них нет доступа для входа в критический раздел без блокировки захвата.
Это невозможно сделать с помощью магии. Ответственность программиста заключается в том, чтобы определить критический раздел (ы) в приложении и защищать его соответствующим образом. Java предоставляет платформу для защиты вашего приложения, но где и что все разделы, подлежащие охране, несет ответственность программиста.
Подробнее о документации java странице
Внутренние блокировки и синхронизация:
Синхронизация построена вокруг внутреннего объекта, известного как встроенная блокировка или блокировка монитора. Внутренние блокировки играют роль в обоих аспектах синхронизации: принудительный эксклюзивный доступ к состоянию объекта и установление происходит до отношений, которые необходимы для видимости.
blockquote>Каждый объект имеет встроенную блокировку связанных с ним . По соглашению поток, который нуждается в эксклюзивном и последовательном доступе к полям объекта, должен получить внутреннюю блокировку объекта перед доступом к ним, а затем освободить внутреннюю блокировку, когда она будет выполнена с ними.
Поток называется собственный встроенный замок между временем, когда он приобрел замок и освободил замок. Пока поток имеет встроенную блокировку, ни один другой поток не может получить одну и ту же блокировку. Другой поток будет блокироваться, когда он попытается получить блокировку.
Когда нить освобождает встроенную блокировку, между этим действием и любым последующим приобретением одной и той же блокировки устанавливается связь между событиями и событиями.
blockquote>Выполнение синхронных методов имеет два эффекта :
Во-первых, невозможно, чтобы две вызовы синхронизированных методов на одном и том же объект для чередования.
blockquote>Когда один поток выполняет синхронизированный метод для объекта, все остальные потоки, которые вызывают синхронизированные методы для одного и того же объекта (приостановить выполнение) до тех пор, пока первый поток не будет выполнен с объектом.
Во-вторых, когда синхронизированный метод завершается, он автоматически устанавливает связь между событиями и последующим вызовом синхронизированного метода для одного и того же объекта.
blockquote>Это гарантирует, что изменения состояния объекта будут видны для всех потоков.
Найдите другие альтернативы синхронизации в:
Короткий ответ: Никакой
Немного более длинный ответ: Да, если Вы наследовали несколько интерфейсов и единственный базовый класс. Так как это обычно - причина MI (Вы хотите реализовать несколько интерфейсов), это обычно достаточно. Однако в тех редких экземплярах, где "реальный" MI полезен.NET препятствует тому, чтобы Вы делали его.
Возможно ограниченным способом в VB.Net таким же образом, что это находится в C#: через Интерфейсы. Так как интерфейс удается к по существу чистому абстрактному базовому классу, можно наследоваться от стольких из тех, сколько Вам нужно и от одного реального класса.