Сатҳи донише, ки барои фаҳмидани мақола зарур аст: шумо супоришҳои Java Syntax ва Java Core-ро анҷом додед ва ҳоло дар раванди омӯзиши Java Multithreading ҳастед. Бунбаст ё бунбаст дар Java ё бунбаст хатоест, ки вақте рух медиҳад, ки риштаҳо аз як ҷуфт an objectҳои ҳамоҳангшуда вобастагии даврӣ доранд. Тасаввур кунед, ки як ришта ба монитори an object
Дар ин ҳолат, ҳарду ришта баста мешаванд ва ҳар кадоме интизоранд, ки дигаре қулфро озод кунад. Аммо ҳеҷ яке аз онҳо ин корро намекунад, зеро барои ин онҳо бояд усули худро анҷом диҳанд ва онро риштаи дигар бастааст. Ҳамин тавр онҳо дар ҷое, ки ин ҳодиса рӯй дод, дармонданд
x
ва дигаре ба монитори an object меравад y
. Агар ришта дар an object x
кӯшиш кунад, ки ягон усули ҳамоҳангшудаи an objectро даъват кунад y
ва an object y
ҳамзамон кӯшиш кунад, ки ягон усули ҳамоҳангшударо дар an object даъват кунад x
, риштаҳо дар интизорӣ мемонанд. Дар зер як мисол аз дастури java docs дар бораи чунин консепсия ба монанди бунбаст оварда шудааст. Дар куҷо бастани ришта дар ин ҷо рух медиҳад?
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s" + " has bowed to me!%n", this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s"
+ " has bowed back to me!%n",
this.name, bower.getName());
}
}
public static void main(String[] args) {
final Friend alphonse =
new Friend("Alphonse");
final Friend gaston =
new Friend("Gaston");
new Thread(new Runnable() {
@Override
public void run() {
// System.out.println("Thread 1");
alphonse.bow(gaston);
// System.out.println("Th: gaston bowed to alphonse");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// System.out.println("Thread 2");
gaston.bow(alphonse);
// System.out.println("2.gaston waiting alph bowed");
}
}).start();
}
}
Дар ин ҷо ду чизи муҳимро фаҳмидан лозим аст:
- Ҳар яке аз риштаҳои ҳамзамон иҷрошаванда чӣ кор мекунад?
- Кадом қуфлҳо истифода мешаванд?
Friend
: alphonse
ва gaston
. Ҳар яке аз онҳо қулфи худро дорад. Ҳамин тариқ, ду қуфлҳо вуҷуд доранд: гиголо ва гастонҳо. Ҳангоми ворид кардани усули ҳамоҳангшудаи an object қулфи он баста мешавад ва ҳангоми баромадан аз метод он озод карда мешавад (ё кушода мешавад). Акнун дар бораи риштаҳо. Биёед риштаи аввалро даъват кунем Alphonse
(бо ҳарфи калон барои фарқ кардани он аз an objectи алфонс). Ин аст он чизе ки он кор мекунад (бигзор онро A
, кӯтоҳ барои Alphonse
):
A: alphonse.bow(gaston) — получает лок alphonse;
A: gaston.bowBack(alphonse) — получает лок gaston;
A: возвращается из обоих методов, тем самым освобождая лок.
Ва ин аст, ки ришта дар айни замон чӣ кор мекунад Gaston
:
G: gaston.bow(alphonse) — получает лок gaston;
G: alphonse.bowBack(gaston) — получает лок alphonse;
G: возвращается из обоих методов, тем самым освобождая лок.
Акнун биёед ин маълумотро ҷамъ кунем ва ҷавоб гирем. Риштаҳо метавонанд бо тартиби гуногун ба ҳам пайваст шаванд (яъне рӯйдодҳои онҳо рӯй медиҳанд). Барои мисол, агар фармоиш чунин бошад, басташавӣ кор хоҳад кард:
A: alphonse.bow(gaston) — получает лок alphonse
G: gaston.bow(alphonse) — получает лок gaston
G: пытается вызвать alphonse.bowBack(gaston), но блокируется, ожидая лока alphonse
A: пытается вызвать gaston.bowBack(alphonse), но блокируется, ожидая лока gaston
deadlock
. Бо вуҷуди ин, бофтани дигар низ имконпазир аст, ки дар он яке аз риштаҳо пеш аз оғози дуюм барои анҷом додани он вақт доранд:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
Дар ин ҳолат, бастани мутақобилаи риштаҳо вуҷуд надорад. Масалан, баъзе усулҳо илова карда шудаанд, ки имкон медиҳад, ки риштаи дигар барои иҷро вақт дошта бошад. Вақте ки натиҷа аз тартиби рӯйдодҳои ҳамзамон рухдода вобаста аст (тартиби ба нақша гирифташуда ё суръати иҷроиш), чунин равандро ба забони русӣ шарти нажод номида мешавад - «шарти нажод». На ҳама шароитҳои мусобиқа эҳтимолан ба бунбаст оварда мерасонанд, аммо дар таҷрибаи ман, танҳо шароити мусобиқа боиси бунбаст мегардад. Муаллиф: Дэйв Лиллетун
Боз чӣ бояд хонд: |
---|
Гурӯҳи таҳиягарони Java: Оптимизатсияи сард SQL, ки аз модели хароҷот вобаста нестанд. Қисми 1 |
GO TO FULL VERSION