Главная » Просмотр файлов » К. Арнольд, Д. Гослинг - Язык программирования Java

К. Арнольд, Д. Гослинг - Язык программирования Java (1160779), страница 36

Файл №1160779 К. Арнольд, Д. Гослинг - Язык программирования Java (К. Арнольд, Д. Гослинг - Язык программирования Java) 36 страницаК. Арнольд, Д. Гослинг - Язык программирования Java (1160779) страница 362019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 36)

Поле balance защищено от любых несинхронных изменений за счет использования методовдоступа, объявленных synchronized. В этом заключается еще одна причина, по которой вместо объявления полей public или protected следуетприменять методы для работы с ними: так вы сможете контролировать синхронизацию доступа к ним.Если поле может измениться, оно никогда не должно считываться в тот момент, когда другой поток производит запись. Доступ к полям долженбыть синхронизирован. Если бы один поток считывал значение поля, пока другой поток его устанавливает, то в результате могло бы получитьсячастично искаженное значение.

Объявление synchronized гарантирует, что два (или более) потока не будут вмешиваться в работу друг друга. Темне менее на порядок выполнения операций не дается никаких гарантий; если сначала произойдет чтение, то оно закончится до того, какначнется запись, и наоборот. Если же вы хотите, чтобы все происходило в строго определенном порядке, работа потоков должнакоординироваться способом, зависящим от конкретного приложения.Методы класса также могут синхронизироваться с использованием блокировки на уровне класса. Два потока не могут одновременно выполнятьсинхронизированные статические методы одного класса.

Блокировка статического метода на уровне класса не отражается на объектахпоследнего — вы можете вызвать синхронизированный метод для объекта, пока другой поток заблокировал весь класс в синхронизированномстатическом методе. В последнем случае блокируются только синхронизированные статические методы.Если синхронизированный метод переопределяется в расширенном классе, то новый метод не обязан быть синхронизированным.

Методсуперкласса при этом остается синхронизированным, так что несинхронность метода в расширенном классе не отменяет егосинхронизированного поведения в суперклассе. Если в несинхронизированном методе используется конструкция super.method() для обращенияк методу суперкласса, то объект блокируется на время вызова до выхода из метода суперкласса.9.2.2.

Операторы synchronizedОператор synchronized позволяет выполнить синхронизированный фрагмент программы, который осуществляет блокировку объекта, не требуяот программиста вызова синхронизированного метода для данного объекта. Оператор synchronized состоит из двух частей: указанияблокируемого объекта и оператора, выполняемого после получения блокировки. Общая форма оператора synchronized выглядит следующимобразом:synchronized (выражение)операторВзятое в скобки выражение должно указывать на блокируемый объект — обычно оно является ссылкой на объект.

После блокировкивыполняется оператор — так, словно для данного объекта выполняется синхронизированный метод. Чаще всего при блокировке объектанеобходимо выполнить сразу несколько операторов, так что оператор, как правило, представляет собой блок. Приведенный ниже методзаменяет каждый элемент числового массива его модулем, причем доступ к массиву регулируется оператором synchronized:/** сделать все элементы массива неотрицательными */public static void abs(int[] values) {synchronized (values) {for (int i = 0; i << values.length; i++) {if (values[i] << 0)values[i] = - values[i];}}}Массив values содержит изменяемые элементы. Мы синхронизируем доступ к нему, указывая его в качестве объекта в операторе synchronized.После этого можно выполнять цикл и быть уверенным в том, что массив не будет изменен каким-либо другим фрагментом программы, в которомтоже установлена синхронизация для массива values.От вас не требуется, чтобы объект, указанный как аргумент оператора synchronized, использовался в теле оператора.

Можно представить себеситуацию, при которой единственное назначение объекта заключается в том, чтобы служить для блокировки большего набора объектов. В этомслучае объект-представитель может и не обладать собственными функциями, но использоваться во всех операторах synchronized, желающихвыполнить действия с некоторыми или всеми объектами из этого набора.В подобных ситуациях существует и другой подход — спроектировать класс-представитель с несколькими синхронизированными методами,служащими для выполнения операций с другими объектами.

При таком варианте не только достигается более четкая инкапсуляция операций, нои исчезает возможный источник ошибок — доступ к объектам вне операторов synchronized, вызванный забывчивостью программиста. Тем неменее иногда с защищаемыми объектами выполняется слишком много операций, чтобы их все можно было инкапсулировать в виде методовкласса, и для защиты многопоточного доступа приходится пользоваться оператором synchronized.Иногда разработчик класса не принимает во внимание его возможное использование в многопоточной среде и не синхронизирует никакиеметоды.

Чтобы применить такой класс в многопоточной среде, у вас имеется две возможности:Создать расширенный класс, в котором вы переопределяете нужные методы, объявляете их synchronized и перенаправляете вызовы этихметодов при помощи ссылки super.Воспользоваться оператором synchronized для обеспечения доступа к объекту, с которым могут работать несколько потоков.●●В общем случае расширение класса является более удачным решением — оно устраняет последствия возможной ошибки программиста,забывающего внести доступ к объекту в оператор synchronized. Тем не менее, если синхронизация необходима лишь в одном-двух фрагментахпрограммы, то оператор synchronized предоставляет более простое решение.9.3. Методы wait и notifyМеханизм блокировки решает проблему с наложением потоков, однако хотелось бы, чтобы потоки могли обмениваться информацией друг сдругом.

Для этого существует два метода: wait и notify. Метод wait позволяет потоку дождаться выполнения определенного условия, а методnotify извещает все ожидающие потоки о наступлении некоторого события.Методы wait и notify определены в классе Object и наследуются всеми классами. Они, подобно блокировке, относятся к конкретным объектам.При выполнении wait вы ожидаете, что некоторый поток известит (notify) о наступлении события тот самый объект, в котором происходитожидание.Существует стандартная конструкция, которой следует пользоваться в работе с wait и notify.

Поток, ожидающий события, должен включать чтонибудь похожее на следующий фрагмент:synchronized void doWhenCondition() {while (!условие)wait();... Действия, выполняемые при выполнении условия ...}Здесь следует обратить внимание на несколько аспектов:Все действия выполняются внутри синхронизированного метода. Это необходимо — в противном случае нельзя быть уверенным всодержимом объекта. Например, если метод не синхронизирован, то после выполнения оператора while нет гарантии, что условиеокажется истинным — ситуация могла быть изменена другим потоком.Одно из важных свойств определения wait заключается в том, что во время приостановки потока происходит атомарное (atomic) снятиеблокировки с объекта.

Когда говорят об атомарной приостановке потока и снятии блокировки, имеется в виду, что эти операциипроисходят вместе и не могут отделяться друг от друга. В противном случае снова возникла бы “гонка”: извещение могло бы придтипосле снятия блокировки, но перед приостановкой потока. В этом случае извещение никак не влияет на работу потока и фактическитеряется. Когда поток возобновляет работу после получения извещения, происходит повторная блокировка.Условие всегда должно проверяться внутри цикла.

Никогда не следует полагать, что возобновление работы потока означает выполнениеусловия. Другими словами, не заменяйте while на if.●●●С другой стороны, метод notify вызывается методами, изменяющими данные, которые могут ожидаться другим потоком.synchronized void changeCondition() {... изменить величину, используемую при проверке условия ...notify();}Несколько потоков могут ждать один и тот же объект. Извещение notify возобновляет тот поток, который ждет дольше всех. Если необходимовозобновить все ожидающие потоки, используйте метод notifyAll.Приводимый ниже класс реализует концепцию очереди. Он содержит методы, которые используются для помещения элементов в очередь и ихудаления:class Queue {// первый и последний элементы очередиElement head, tail;public synchronized void append(Element p) {if (tail == null)head = p;elsetail.next = p;p.next = null;tail = p;notify(); // сообщить ожидающим потокам о новом элементе}public synchronized Element get() {try {while(head == null)wait(); // ожидать появления элемента} catch (InterruptedException e) {return;}}}Element p = head;head = head.next;if (head == null)tail = null;return p;// запомнить первый элемент// удалить его из очереди// проверить, не пуста ли очередьТакая реализация очереди во многом напоминает ее воплощение в однопоточной системе.

Отличий не так уж много: методы синхронизированы;при занесении нового элемента в очередь происходит извещение ожидающих потоков; вместо того чтобы возвращать null для пустой очереди,метод get ждет, пока какой-нибудь другой поток занесет элемент в очередь. Как занесение, так и извлечение элементов очереди можетосуществляться несколькими потоками (а не обязательно одним).9.4.

Подробности, касающиеся wait и notifyСуществует три формы wait и две формы notify. Все они входят в класс Object и выполняются для текущего потока:public final void wait(long timeout) throws InterruptedExceptionВыполнение текущего потока приостанавливается до получения извещения или до истечения заданного интервала времени timeout. Значениеtimeout задается в миллисекундах. Если оно равно нулю, то ожидание не прерывается по тайм-ауту, а продолжается до получения извещения.public final void wait(long timeout, int nanos) ••throws InterruptedExceptionАналог предыдущего метода с возможностью более точного контроля времени; интервал тайм-аута представляет собой сумму двух параметров:timeout (в миллисекундах) и nanos (в наносекундах, значение в диапазоне 0–999999).public final void wait() throws InterruptedExceptionЭквивалентно wait(0).public final void notify()Посылает извещение ровно одному потоку, ожидающему выполнения некоторого условия.

Потоки, которые возобновляются лишь послевыполнения данного условия, могут вызвать одну из разновидностей wait. При этом выбрать извещаемый поток невозможно, поэтому даннаяформа notify используется лишь в тех случаях, когда вы точно знаете, какие потоки ожидают событий, какие это события и сколько длитсяожидание. Если вы не уверены в каком-либо из этих факторов, вероятно, следует воспользоваться методом notifyAll.public final void notifyAll()Посылает извещения всем потокам, ожидающим выполнения некоторого условия. Обычно потоки стоят, пока какой-то другой поток не изменитнекоторое условие.

Характеристики

Тип файла
PDF-файл
Размер
1,1 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6360
Авторов
на СтудИзбе
310
Средний доход
с одного платного файла
Обучение Подробнее