Хорошее видео, продолжай в том же духе! Спасибо тебе за уроки!
@svyatoiambrozii Жыл бұрын
Супер пример получился!👍
@vladzuev10 Жыл бұрын
Большое спасибо!)
@АлександраКарабанова Жыл бұрын
Отличный познавательный урок
@rasZam Жыл бұрын
Очень крутые уроки!
@vladzuev10 Жыл бұрын
Спасибо большое!) Безумно приятно!)
@maksmolch Жыл бұрын
Спасибо за уроки! Продолжай!!!
@vladzuev10 Жыл бұрын
Вам спасибо!)
@arenmkhoyan Жыл бұрын
Я так и до конца не понял зачем эти while а не if) Спасибо за уроки, супер видео
@vladzuev10 Жыл бұрын
И Вам за комментарий!) Давайте представим, что у нас есть буфер и два потока(Thread-0 и Thread-1) потребляют элементы с этого буфера, а один(Thread-2) кладет элементы в наш буфер. Рассмотрим случай, когда буфер пуст и мы вызываем метод await внутри блока if. Пусть сначала поток Thread-0 пытается извлечь элемент из буфера. Он видит, что буфер пуст и вызывает метод await. Затем пусть поток Thread-1 пытается извлечь элемент из буфера. Он так же видит, что буфер пуст и вызывает метод await. Затем поток Thread-2 без проблем ложит элемент в наш буфер и будит ранее заблокированные потоки Thread-0 и Thread-1. Затем пусть отрабатывает поток Thread-0. Он извлекает элемент из нашего буфера, который положил поток Thread-2, и в этот момент буфер снова пуст. Но затем вполне возможно, что поток Thread-1 начнет свою работу с точки вызова метода await. Т.к. мы написали if вместо while, поток Thread-1 начнет извлекать элемент из пустого буфера из-за чего возникнет ошибка. Чтобы этого избежать, поток Thread-1 должен еще раз перепроверить, не пуст ли наш буфер снова. Именно поэтому и необходимо помещать вызов метода await в цикл while. Очень надеюсь, что ответил) Извиняюсь за долгий ответ) Что-то я проморгал Ваш комментарий)
@arlenasanov2 ай бұрын
Для чего в методах isFull, isEmpty, toString нужно вызывать lock, unlock, разве там синхронизация нужна? И еще, когда вызывается метод take или put, они вызывают метод lock, а потом в while вызываются методы isEmpty и isFull, которые уже сами вызывают внутри себя метод lock, это получается на одном и том же объекте Lock вызывается 2 раза метод lock, это как-то влияет на что-то, или можно много раз вызывать метод lock, но после первого вызова толку не будет?
@vladzuev102 ай бұрын
В методах isFull, isEmpty, toString необходимо выполнять всю работу, захватывая замок. Синхронизация должна использоваться не только во время записи в совместные переменные, но и во время чтения из этих переменных. Да, метод lock достаточно вызвать только один раз. Если метод lock вызывается несколько раз, то замок все так же будет захвачен, и никакого отличия не будет. Единственное, если метод lock вызывался какое-то N-e количество раз, то необходимо вызвать N-е количество раз метод unlock для того, чтобы замок был освобожден. В примере было сделано так, т.к. методы isFull и isEmpty были объявлены с модификатором доступа public, и могут использоваться вне методов put и take.