пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Методы synchronized.Инструкция synchronized.

Основное различие между потоками и процессами состоит в том, что процессы защищены от воздействия друг на друга средствами операционной системы(каждый процесс выполняется в своем адресном пространстве). Использование потоков, лишенных подобной защиты, позволяет быстро запускать новые потоки и способствует их производительности. Однако здесь есть и отрицательный эффект – любой из потоков может получить доступ и даже внести изменения в данные, которые другой поток считает принадлежащими только ему. Решение этой проблемы состоит в синхронизации потоков. Ситуация, когда много потоков, обращающихся к некоторому общему ресурсу, начинают мешать друг другу, очень часта. Например, когда два потока записывают информацию в файл/объект/поток. Синхронизация кода реализуется 2-мя основными способами.
Если критическим участком является метод, то можно просто указать ключевое слово sychronized в объявлении метода, т.е.
synchronized void myMethod ( )          { … }
Эквивалентный код можно представить в виде:
void myMethod ()
{synchronized (this)
Если нет доступа к классу, в котором объявлен метод, то для его синхронизации можно использовать следующий прием:
synchonized (object)
{ // операторы критического участка, в том числе и вызовы метода}.
Здесь object – ссылка на объект, который нужно синхронизировать, т.е. объект элементом которого является вызываемый метод. При синхронизации одного оператора фигурные скобки можно опускать.
В Java кроме использования блока synchonized разработаны и эффективные средства межпроцессового взаимодействия. Например, метод
public final void wait ( ) throws InterruptedException;
осуществляет перевод вызывающего потока в режим ожидания, пока некоторый другой поток не введет notify().
Существуют и другие варианты метода, например,
public final void wait (long timeout ) throws InterruptedException;
осуществляет задержку на определенное время.
public final void notify();
«пробуждает» первый поток, который вызвал ожидание- wait ( ); на том же объекте.


28.12.2017; 02:20
хиты: 103
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь