Урок по Java 76: Многопоточность 11: ReentrantLock

preview_player
Показать описание
Cкидки до 22-го января на все курсы всего за 9.99:
Каждый купон расчитан на 10 покупок, спешите!
Новый курс по Photoshop:

HIBERNATE:
JPA:
HTML + CSS:
MAVEN:
GIT:
KOTLIN
SQL:
IDEA
Паттерны Java:
Java EE:
Английский язык:
JAVA:
Apache Spark:
Рекомендации по теме
Комментарии
Автор

Спасибо за урок, не зря мой друг тебя посоветовал посмотреть)

Миша-йыщ
Автор

Чтоб хорошо понимать эту тему нужно знать что такое монитор и как он устроен. Это же относится и к Syn-Wait-Notify темам. Да и вообще неплохо бы было сделать урок про организацию работы потоков осью. Тогда все эти уроки будут складыватся в пазл.
З.Ы. Я считаю, что этим урокам нехватает теории. К примеру у вас отдельно по времени стоят уроки по сериализации(deep copy) и клонированию объектов(shallow copy). Я бы их вообще в одну тему объединил и рассказал о сути работы этих принципах на графах. И так во многих местах. Но все-равно считаю, что ваши уроки неплохие. Спасибо за труд.

deo
Автор

важно было бы понимать, что локи пришли из пакета Concurrency. Насколько я понимаю, они призваны исправить главную проблему synchronized - вырождение многопоточности в один поток. Может 7 лет назад это было не так актуально, но сегодня точно актуально. И теперь я хочу увидеть прежде всего именно различие между lock и synchronized в контексте вышеупомянутой проблемы. Ну согласитесь, что lock и unlock написать, что на каждом методе synchronized поставить - вряд ли для этого понадобился новый пакет. Пока я этого не увидел, буду смотреть дальше.

mizantropoff
Автор

В данном случае можно было в run эти два вызываемых метода поместить в synchronized блок и получился бы тот же результат, если не ошибаюсь.

Дмитрий-юкг
Автор

Замечу, для тех кто будет смотреть

public ReentrantLock(boolean fair) - по умолчанию false.Это значит честный или не честный reentran :)
Честный - потоки встают в очередь.В момент unlock в lock заходит поток который первый встал "перед" локом(wait set, blocking set theory".Чертовски замедляет работу.
Не честный - занимает тот который смог.
По умолчанию - false.То есть не честный.
Если честно учитель я так себе =\
Спасибо за урок, дружище.

ВадимШатов-зй
Автор

Но можно для этой же цели сделать синхронизированным вызывающий метод, а в вызываемых ничего не писать. Сами по себе они вызываться не могут, если в одном методе мы залочили и все. Если быдут какая-то сложная логика вызовов с условиями, тогда имет смысл такое писать. Но методы, где вызывается блокировка и выход без разблокировки, могут быть потенциальным источником ошибок. Этим очень умело нужно пользоваться. А лучше все-таки обойтись synchronized в вызывающем методе и передавать ему какой-нибудь объект в качестве монитора. Не обязательно this. Это будет гибче, но надежнее.

shadrunov
Автор

чтобы лучше увидеть, что changeJ () выполнится только после changeI () и один из потоков подождет пока другой не завершит выполнение методов changeI () и changeJ () можно добавить:

void changeI() {
lock.lock();
int i = this.i;
if {
Thread.yield();
}
i++;
this.i = i;
System.out.println("thread + " has finished changeI()");
}

void changeJ() {
int j = this.j;
if {
Thread.yield();
}
j++;
this.j = j;
lock.unlock();
System.out.println("thread + " has finished changeJ()");
}

andrii-
Автор

Спасибо за урок! хотелось бы узнать об остальных меnодах ReentrantLock например Как определить в каком состоянии сейчас (монитор или Lock) Может не точно выразился ... поправьте

Basicprof
Автор

про программу на 00:00, удалите If - останется все тоже, автор не дурак, но...кр4, ребят почитай про race condition, из-за гонки потоков результаты программы - 6 или 7 - будут разные;
race condition - использование 2 и более потоками общего/критического ресурса;join гарантирует, что t1 завершиться после выполнения t1.join(), НО не гарантирует, что t1 не завершится до t1.join() т.е. тут 1-й поток ГАРАНИТРОВАНО успеет увеличить на единицу переменную i - точно i будет 6 - но мы не можем знать успеет ли t2 увеличить до того как main-поток выведет i в консоль, потому что main-поток может быть быстрее t2 и успеет вывести на экран значение переменной i ДО того как t2 увеличит значение переменной i.

УчитьИещёразучить
Автор

А анлок делать разве не в finally надо? Учитывая это, лок-анлок в разных методах так красиво не получится сделать.

dmitryWeirdo
Автор

А почему 7, а не 6? Каждый поток вызывается два раза что ли?

dm-a
welcome to shbcf.ru