Сообщений: 72
Тем: 18
Зарегистрирован: Jun 2013
Репутация:
-25
Здравствуйте!
Подскажите, нужно ли включать эту функцию и что это вообще такое?
# Авторестарт если найден deadlock
DeadLockFoundRestart = False
Сообщений: 128
Тем: 0
Зарегистрирован: Feb 2014
Репутация:
625
Может быть стоит прочесть, для начала, что такое deadlock?
Сообщений: 72
Тем: 18
Зарегистрирован: Jun 2013
Репутация:
-25
shegan Написал:Может быть стоит прочесть, для начала, что такое deadlock?
Ничего себе ты помощник, а я то думал зря гугл юзал.
Меня интересует что такое deadlock в на л2 сервере.
Сообщений: 329
Тем: 16
Зарегистрирован: Nov 2014
dantest Написал:Ничего себе ты помощник, а я то думал зря гугл юзал.
Меня интересует что такое deadlock в на л2 сервере.
Гугл в бане???????
Код: public void exchange(final Account acc1, final Account acc2, final int count) throws Exception
{
synchronized (acc1)
{
synchronized (acc2)
{
if (acc1.getAdena().compareTo(count) < 0)
throw new Exception();
else
{
acc1.give(count);
acc2.take(count);
}
}
}
}
Вот пример взаимной блокировки или же Deadlock.
Сообщений: 72
Тем: 18
Зарегистрирован: Jun 2013
Репутация:
-25
GenCloud Написал:Гугл в бане???????
Код: public void exchange(final Account acc1, final Account acc2, final int count) throws Exception
{
synchronized (acc1)
{
synchronized (acc2)
{
if (acc1.getAdena().compareTo(count) < 0)
throw new Exception();
else
{
acc1.give(count);
acc2.take(count);
}
}
}
}
Вот пример взаимной блокировки или же Deadlock.
Я интересовался, как это повлияет на игру если не сделать рестарт если такой Deadlock имеется.
Сообщений: 561
Тем: 44
Зарегистрирован: Sep 2011
Репутация:
412
GenCloud Написал:Гугл в бане???????
Код: public void exchange(final Account acc1, final Account acc2, final int count) throws Exception
{
synchronized (acc1)
{
synchronized (acc2)
{
if (acc1.getAdena().compareTo(count) < 0)
throw new Exception();
else
{
acc1.give(count);
acc2.take(count);
}
}
}
}
Вот пример взаимной блокировки или же Deadlock.
Можете пояснить почему тут будет DeadLock?
Сообщений: 329
Тем: 16
Зарегистрирован: Nov 2014
flopix Написал:Можете пояснить почему тут будет DeadLock?
Взимание адены(1) займет монитор счета acc1, получение адены(2) займет монитор счета acc2. Произойдет взаимная блокировка, т.е. почему: взимание адены(1) ждет, пока получение адены(2) освободит монитор счета acc2, но для этого получение адены(2) должна получить доступ к монитору acc1, занятому взиманием адены(1).
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
dantest Написал:Я интересовался, как это повлияет на игру если не сделать рестарт если такой Deadlock имеется.
Со временем локнутся все триды в пуле packets, если дедлок в исполнении пакетов, сервер перестанет обрабатывать пакеты, очередь пакетов переполнится и мы получим out of memory, но скорее всего, перед этим Вам позвонит офигевший ГМ и скажет, что сервер повис.
Если включить, то ситуация аналогична, но офигевший ГМ уже звонит, то что сервер сам перезагружается. Особенно, это весело на эпиках.
Пример классического дедлока:
Код: static Object sync1 = new Object();
static Object sync2 = new Object();
public static void main(String[] args) {
new Thread(() -> one()).start();
new Thread(() -> two()).start();
}
static void one() {
synchronized (sync1) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {}
synchronized (sync2) {
System.out.println("pew");
}
}
}
static void two() {
synchronized (sync2) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {}
synchronized (sync1) {
System.out.println("ololo");
}
}
}
Состояние гонки - тоже самое, но без слипа тридов. Если повезет, то можно поймать дедлок.
И вообще, google it.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 72
Тем: 18
Зарегистрирован: Jun 2013
Репутация:
-25
Pointer*Rage Написал:Со временем локнутся все триды в пуле packets, если дедлок в исполнении пакетов, сервер перестанет обрабатывать пакеты, очередь пакетов переполнится и мы получим out of memory, но скорее всего, перед этим Вам позвонит офигевший ГМ и скажет, что сервер повис.
Если включить, то ситуация аналогична, но офигевший ГМ уже звонит, то что сервер сам перезагружается. Особенно, это весело на эпиках.
Пример классического дедлока:
Код: static Object sync1 = new Object();
static Object sync2 = new Object();
public static void main(String[] args) {
new Thread(() -> one()).start();
new Thread(() -> two()).start();
}
static void one() {
synchronized (sync1) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {}
synchronized (sync2) {
System.out.println("pew");
}
}
}
static void two() {
synchronized (sync2) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {}
synchronized (sync1) {
System.out.println("ololo");
}
}
}
Состояние гонки - тоже самое, но без слипа тридов. Если повезет, то можно поймать дедлок.
И вообще, google it.
Спасибо большое!
Сообщений: 561
Тем: 44
Зарегистрирован: Sep 2011
Репутация:
412
09-23-2015, 11:32 PM
(Сообщение последний раз редактировалось: 09-24-2015, 12:32 AM flopix.)
GenCloud Написал:Взимание адены(1) займет монитор счета acc1, получение адены(2) займет монитор счета acc2. Произойдет взаимная блокировка, т.е. почему: взимание адены(1) ждет, пока получение адены(2) освободит монитор счета acc2, но для этого получение адены(2) должна получить доступ к монитору acc1, занятому взиманием адены(1).
Этот код может служить аналогией вашему примеру?
PHP код: <?php
Object acc1 = new Object();
Object acc2 = new Object();
Object acc3;
Object acc4;
synchronized (acc1)
{
synchronized (acc2)
{
acc3 = acc1;
acc4 = acc2;
}
}
Деадлок он не вызывает. Помоему во вложенных синхронизациях допускается доступ к обоим объектам синхронизации.
Точнее даже для реализации деадлока нужно минимум 2 потока.
|