Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
# Авторестарт если найден deadlock
#1
Здравствуйте!
Подскажите, нужно ли включать эту функцию и что это вообще такое?

# Авторестарт если найден deadlock
DeadLockFoundRestart = False
Ответ
#2
Может быть стоит прочесть, для начала, что такое deadlock?
Ответ
#3
shegan Написал:Может быть стоит прочесть, для начала, что такое deadlock?

Ничего себе ты помощник, а я то думал зря гугл юзал.
Меня интересует что такое deadlock в на л2 сервере.
Ответ
#4
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.
Ответ
#5
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 имеется.
Ответ
#6
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?
Ответ
#7
flopix Написал:Можете пояснить почему тут будет DeadLock?

Взимание адены(1) займет монитор счета acc1, получение адены(2) займет монитор счета acc2. Произойдет взаимная блокировка, т.е. почему: взимание адены(1) ждет, пока получение адены(2) освободит монитор счета acc2, но для этого получение адены(2) должна получить доступ к монитору acc1, занятому взиманием адены(1).
Ответ
#8
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.
Гадаю по капче.
Ответ
#9
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.

Спасибо большое!
Ответ
#10
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 потока.
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Обрыв каста, если цель не видно. elastic 7 2,898 02-20-2015, 10:00 PM
Последний пост: KilRoy
  Снятие HAIR если сняли DHAIR L2J 5 1,724 08-14-2014, 05:20 PM
Последний пост: Donatte
  Запрет атаки если присутсвует меньше игроков Rolfer 1 1,533 05-14-2014, 06:25 PM
Последний пост: n3k0nation
  Если игрок соответствует устовиям L2J 16 2,892 05-12-2014, 03:29 PM
Последний пост: ANZO
  "Если (персонаж.отошёл на() >= (n) метров)..." finfan 11 3,173 05-03-2012, 06:12 AM
Последний пост: bloodshed
  Авторестарт Логин сервера. Evil-Soft 9 6,003 06-05-2010, 10:26 PM
Последний пост: ginger
  Как запретить использ. скилл, если нет душ Stema 1 2,537 12-01-2008, 11:46 PM
Последний пост: Stema

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)