Блокировка и синхронизация потоков
Я знаю, что мне нужно правильно использовать синхронизацию, чтобы избежать взаимоблокировок при использовании нескольких потоков, но мне было интересно:
Нужно ли выполнять синхронизацию как для изменения значения, так и для проверки переменной, или мне просто нужно синхронизировать, когда я изменяю значение, а не когда я проверяю переменную?
5 ответов
Что касается взаимоблокировки: Darkhogg уже правильно указал, что взаимоблокировка является результатом неправильной синхронизации и рабочего процесса.
Синхронизация изменений состояния и наблюдения за состоянием: да, вам нужно синхронизировать оба. Эффект блокировки объекта, которую вы получаете при входе в синхронизированный метод, заключается в том, что никакой другой поток не может ввести тот же или другой блок синхронизированного кода, который требует такой же блокировки объекта (синхронизирует один и тот же объект). Тем не менее, если вы не синхронизируете код, который наблюдает за состоянием вашего объекта, то этот код может выполняться одновременно с синхронизированным кодом, который изменяет состояние, и вы можете прочитать недопустимое состояние объекта.
Прочитайте эту статью, чтобы вы могли лучше понять базу знаний о синхронизации http://javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html
Как упомянул Darkhogg, синхронизация вызывает взаимные блокировки, если не используется должным образом.
Вам необходимо синхронизировать блоки кода на элементах данных, которые обновляют (изменяют элементы данных) значение и могут выполняться несколькими потоками.
Синхронизация будет гарантировать, что элементы данных не будут обновляться одновременно.
Если у вас есть ресурс, который не является потокобезопасным, вам нужно будет защитить как проверку, так и изменение его значения.
Синхронизировать не использовать, чтобы избежать тупика
Синхронизируйте ключевое слово, чтобы обеспечить безопасность потока в многопоточной среде. Хотя у вас есть многопоточность, вы хотите изменить и проверить переменные-члены.
Для этого создайте класс, который содержит переменные данных, которые вы хотите сохранить в потоке. создать синхронизированную функцию для добавления и изучения переменных.
class exam
{
....
synchronized void examine()
{}
synchronized void amending()
{}
}
создайте один объект класса и передайте его всему потоку.