Блокировка и синхронизация потоков

Я знаю, что мне нужно правильно использовать синхронизацию, чтобы избежать взаимоблокировок при использовании нескольких потоков, но мне было интересно:

Нужно ли выполнять синхронизацию как для изменения значения, так и для проверки переменной, или мне просто нужно синхронизировать, когда я изменяю значение, а не когда я проверяю переменную?

5 ответов

Решение

Что касается взаимоблокировки: Darkhogg уже правильно указал, что взаимоблокировка является результатом неправильной синхронизации и рабочего процесса.

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

Прочитайте эту статью, чтобы вы могли лучше понять базу знаний о синхронизации http://javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html

Как упомянул Darkhogg, синхронизация вызывает взаимные блокировки, если не используется должным образом.

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

Синхронизация будет гарантировать, что элементы данных не будут обновляться одновременно.

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

Синхронизировать не использовать, чтобы избежать тупика

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

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

class exam
{
 ....

 synchronized void examine()
 {}


 synchronized void amending()
 {}


}

создайте один объект класса и передайте его всему потоку.

Другие вопросы по тегам