Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Class initialization Deadlock / 9 сообщений из 9, страница 1 из 1
07.12.2018, 19:29
    #39744544
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class initialization Deadlock
Вопрос навеян:

https://habr.com/company/odnoklassniki/blog/255067/

первый пример понятен:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
static class A {
        static final B b = new B();
    }

    static class B {
        static final A a = new A();
    }

    public static void main(String[] args) {
        new Thread(A::new).start();
        new B();
    }



объект класса A и объект класса B создаются параллельно.
Так как это первое обращение в программе, то статические блоки исполняются в параллель и эти временные отрезки могут(но не обязаны) пересечься.

Есть неявный лок на инициализацию статики.

Классу A чтобы инициализироваться необходимо инициализировать статическое поле типа B
Классу B чтобы инициализироваться необходимо инициализировать статическое поле типа A


Дэдлок!


А вот второй пример не понятен:
авторДело в том, что согласно §5.5 спецификации JVM у каждого класса есть уникальный initialization lock, который захватывается на время инициализации. Когда другой поток попытается обратиться к инициализируемому классу, он будет заблокирован на этом локе до завершения инициализации первым потоком. При конкурентной инициализации нескольких ссылающихся друг на друга классов нетрудно наткнуться на взаимную блокировку.

Именно это и случилось, к примеру, в проекте QueryDSL:
Код: java
1.
2.
3.
4.
public final class Ops {
    public static final Operator<Boolean> EQ = new OperatorImpl<Boolean>(NS, "EQ");
    public static final Operator<Boolean> NE = new OperatorImpl<Boolean>(NS, "NE");
    ...


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public final class OperatorImpl<T> implements Operator<T> {

    static {
        try {
            // initialize all fields of Ops
            List<Field> fields = new ArrayList<Field>();
            fields.addAll(Arrays.asList(Ops.class.getFields()));
            for (Class<?> cl : Ops.class.getClasses()) {
                fields.addAll(Arrays.asList(cl.getFields()));
            }
            ...




Прошу помощи в объяснении.
...
Рейтинг: 0 / 0
07.12.2018, 21:07
    #39744566
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class initialization Deadlock
questionerПрошу помощи в объяснении.
getFields отдаёт в том числе статические поля, которые должны быть инициализированы, но их инициализация упирается в инициализацию OperatorImpl, инициализация кторого в свою очередь упирается в инициализацию Ops, инициализация кторого в свою очередь упирается в статические поля, которые должны быть инициализированы, но их инициализация упирается в ...
...
Рейтинг: 0 / 0
07.12.2018, 23:52
    #39744609
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class initialization Deadlock
alex55555questionerПрошу помощи в объяснении.
getFields отдаёт в том числе статические поля, которые должны быть инициализированы, но их инициализация упирается в инициализацию OperatorImpl, инициализация кторого в свою очередь упирается в инициализацию Ops, инициализация кторого в свою очередь упирается в статические поля, которые должны быть инициализированы, но их инициализация упирается в ...

Что-то сложно. Можно попросить вас объяснить в терминах, что поток_1 делает то-то, второй поток то-то, там то делается блокировка ресурса А, там-то ресурса Б.
...
Рейтинг: 0 / 0
08.12.2018, 12:41
    #39744685
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class initialization Deadlock
redwhite90Что-то сложно.
Со сложностью нужно учиться жить, иначе так и останетесь на всю жизнь вечно спрашивающим.
redwhite90что поток_1 делает то-то, второй поток то-то, там то делается блокировка ресурса А, там-то ресурса Б.
Потоки есть детали реализации JVM. Расскажете про эти детали - я вам отвечу. А так - если вы пишете JVM, тогда бы я понял ваш вопрос, но вы пока разве что на сложность пеняете, а значит JVM однозначно не пишете, поэтому никаких деталей реализации не приведёте. А раз нет деталей - какие к чертям потоки? С какого потолка?
...
Рейтинг: 0 / 0
08.12.2018, 14:12
    #39744705
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class initialization Deadlock
alex55555redwhite90Что-то сложно.
Со сложностью нужно учиться жить, иначе так и останетесь на всю жизнь вечно спрашивающим.
redwhite90что поток_1 делает то-то, второй поток то-то, там то делается блокировка ресурса А, там-то ресурса Б.
Потоки есть детали реализации JVM. Расскажете про эти детали - я вам отвечу. А так - если вы пишете JVM, тогда бы я понял ваш вопрос, но вы пока разве что на сложность пеняете, а значит JVM однозначно не пишете, поэтому никаких деталей реализации не приведёте. А раз нет деталей - какие к чертям потоки? С какого потолка?


На что Вы обиделись то?

Если Вы понимаете механизм- для Вас не должно составить труда его объяснить. Обычный дедлок ведь легко объяснить:

Поток 1 захватил ресурс А и пытается захватить ресурс Б
Поток 2 захватил ресурс Б и пытается захватить ресурс А
В один момент времени ресурсом может владеть только один поток.

На основании трёх предложений всё понятно.
...
Рейтинг: 0 / 0
09.12.2018, 15:52
    #39744950
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class initialization Deadlock
questionerНа что Вы обиделись то?
Я не обиделся, но попытался указать на необходимость знания деталей реализации JVM. Вы знания не продемонстрировали, но априори утверждаете, что потоки обязательно должны быть. Ведь так? И поэтому я тогда спросил - с какого потолка вы это взяли? Ответа опять нет. Но есть вот рассуждения про обиды. Как связаны реализация JVM и обиды?
questionerОбычный дедлок ведь легко объяснить:

Поток 1 захватил ресурс А и пытается захватить ресурс Б
Поток 2 захватил ресурс Б и пытается захватить ресурс А
В один момент времени ресурсом может владеть только один поток.

На основании трёх предложений всё понятно.
Но это именно обычная ситуация, а не та, которая случается, когда JVM грузит классы. Принципиально в данном случае лишь то, что возникает взаимная зависимость двух задач (которую я и показал). Всё остальное - детали реализации. Если вы реализуете потоки, тогда можно говорить о конфликтующем захвате ресурсов, но вопрос был про JVM, поэтому повторюсь - с какого потолка там потоки?

Ладно, совсем коротко - если некие действия зависимы, то зависимость мешает им двигаться свободно, что мы и наблюдаем в случае с загрузкой классов.
...
Рейтинг: 0 / 0
10.12.2018, 11:44
    #39745198
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class initialization Deadlock
alex55555questionerНа что Вы обиделись то?
Я не обиделся, но попытался указать на необходимость знания деталей реализации JVM. Вы знания не продемонстрировали, но априори утверждаете, что потоки обязательно должны быть. Ведь так? И поэтому я тогда спросил - с какого потолка вы это взяли? Ответа опять нет. Но есть вот рассуждения про обиды. Как связаны реализация JVM и обиды?
questionerОбычный дедлок ведь легко объяснить:

Поток 1 захватил ресурс А и пытается захватить ресурс Б
Поток 2 захватил ресурс Б и пытается захватить ресурс А
В один момент времени ресурсом может владеть только один поток.

На основании трёх предложений всё понятно.
Но это именно обычная ситуация, а не та, которая случается, когда JVM грузит классы. Принципиально в данном случае лишь то, что возникает взаимная зависимость двух задач (которую я и показал). Всё остальное - детали реализации. Если вы реализуете потоки, тогда можно говорить о конфликтующем захвате ресурсов, но вопрос был про JVM, поэтому повторюсь - с какого потолка там потоки?

Ладно, совсем коротко - если некие действия зависимы, то зависимость мешает им двигаться свободно, что мы и наблюдаем в случае с загрузкой классов.

Ну Вы прям прям Америку открыли. Потревожили великого гуру))


У какого-то там Пангина, который ничего не смыслит слово поток в объяснении присутствует.Но куда уж ему до Вас, о великого)
авторДело в том, что согласно §5.5 спецификации JVM у каждого класса есть уникальный initialization lock, который захватывается на время инициализации. Когда другой поток попытается обратиться к инициализируемому классу, он будет заблокирован на этом локе до завершения инициализации первым потоком. При конкурентной инициализации нескольких ссылающихся друг на друга классов нетрудно наткнуться на взаимную блокировку.
...
Рейтинг: 0 / 0
10.12.2018, 14:14
    #39745337
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class initialization Deadlock
questionerУ какого-то там Пангина, который ничего не смыслит слово поток в объяснении присутствует.Но куда уж ему до Вас, о великого)
Умеющий читать да прочитает. Но вы же не умеете, правда?

Всё мною выше сказанное остаётся в силе, ну а если некто предпочитает Панагина - пусть у него и спрашивает. Хотя здесь даже спрашивать нет нужды - вижу просто неумение читать.
...
Рейтинг: 0 / 0
10.12.2018, 16:14
    #39745445
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class initialization Deadlock
alex55555questionerУ какого-то там Пангина, который ничего не смыслит слово поток в объяснении присутствует.Но куда уж ему до Вас, о великого)
Умеющий читать да прочитает. Но вы же не умеете, правда?

Всё мною выше сказанное остаётся в силе, ну а если некто предпочитает Панагина - пусть у него и спрашивает. Хотя здесь даже спрашивать нет нужды - вижу просто неумение читать.

Спасибо за совет) уже так и сделал.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Class initialization Deadlock / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]