|
Class initialization Deadlock
|
|||
---|---|---|---|
#18+
Вопрос навеян: https://habr.com/company/odnoklassniki/blog/255067/ первый пример понятен: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
объект класса A и объект класса B создаются параллельно. Так как это первое обращение в программе, то статические блоки исполняются в параллель и эти временные отрезки могут(но не обязаны) пересечься. Есть неявный лок на инициализацию статики. Классу A чтобы инициализироваться необходимо инициализировать статическое поле типа B Классу B чтобы инициализироваться необходимо инициализировать статическое поле типа A Дэдлок! А вот второй пример не понятен: авторДело в том, что согласно §5.5 спецификации JVM у каждого класса есть уникальный initialization lock, который захватывается на время инициализации. Когда другой поток попытается обратиться к инициализируемому классу, он будет заблокирован на этом локе до завершения инициализации первым потоком. При конкурентной инициализации нескольких ссылающихся друг на друга классов нетрудно наткнуться на взаимную блокировку. Именно это и случилось, к примеру, в проекте QueryDSL: Код: java 1. 2. 3. 4.
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Прошу помощи в объяснении. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2018, 19:29 |
|
Class initialization Deadlock
|
|||
---|---|---|---|
#18+
questionerПрошу помощи в объяснении. getFields отдаёт в том числе статические поля, которые должны быть инициализированы, но их инициализация упирается в инициализацию OperatorImpl, инициализация кторого в свою очередь упирается в инициализацию Ops, инициализация кторого в свою очередь упирается в статические поля, которые должны быть инициализированы, но их инициализация упирается в ... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2018, 21:07 |
|
Class initialization Deadlock
|
|||
---|---|---|---|
#18+
alex55555questionerПрошу помощи в объяснении. getFields отдаёт в том числе статические поля, которые должны быть инициализированы, но их инициализация упирается в инициализацию OperatorImpl, инициализация кторого в свою очередь упирается в инициализацию Ops, инициализация кторого в свою очередь упирается в статические поля, которые должны быть инициализированы, но их инициализация упирается в ... Что-то сложно. Можно попросить вас объяснить в терминах, что поток_1 делает то-то, второй поток то-то, там то делается блокировка ресурса А, там-то ресурса Б. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2018, 23:52 |
|
Class initialization Deadlock
|
|||
---|---|---|---|
#18+
redwhite90Что-то сложно. Со сложностью нужно учиться жить, иначе так и останетесь на всю жизнь вечно спрашивающим. redwhite90что поток_1 делает то-то, второй поток то-то, там то делается блокировка ресурса А, там-то ресурса Б. Потоки есть детали реализации JVM. Расскажете про эти детали - я вам отвечу. А так - если вы пишете JVM, тогда бы я понял ваш вопрос, но вы пока разве что на сложность пеняете, а значит JVM однозначно не пишете, поэтому никаких деталей реализации не приведёте. А раз нет деталей - какие к чертям потоки? С какого потолка? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2018, 12:41 |
|
Class initialization Deadlock
|
|||
---|---|---|---|
#18+
alex55555redwhite90Что-то сложно. Со сложностью нужно учиться жить, иначе так и останетесь на всю жизнь вечно спрашивающим. redwhite90что поток_1 делает то-то, второй поток то-то, там то делается блокировка ресурса А, там-то ресурса Б. Потоки есть детали реализации JVM. Расскажете про эти детали - я вам отвечу. А так - если вы пишете JVM, тогда бы я понял ваш вопрос, но вы пока разве что на сложность пеняете, а значит JVM однозначно не пишете, поэтому никаких деталей реализации не приведёте. А раз нет деталей - какие к чертям потоки? С какого потолка? На что Вы обиделись то? Если Вы понимаете механизм- для Вас не должно составить труда его объяснить. Обычный дедлок ведь легко объяснить: Поток 1 захватил ресурс А и пытается захватить ресурс Б Поток 2 захватил ресурс Б и пытается захватить ресурс А В один момент времени ресурсом может владеть только один поток. На основании трёх предложений всё понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2018, 14:12 |
|
Class initialization Deadlock
|
|||
---|---|---|---|
#18+
questionerНа что Вы обиделись то? Я не обиделся, но попытался указать на необходимость знания деталей реализации JVM. Вы знания не продемонстрировали, но априори утверждаете, что потоки обязательно должны быть. Ведь так? И поэтому я тогда спросил - с какого потолка вы это взяли? Ответа опять нет. Но есть вот рассуждения про обиды. Как связаны реализация JVM и обиды? questionerОбычный дедлок ведь легко объяснить: Поток 1 захватил ресурс А и пытается захватить ресурс Б Поток 2 захватил ресурс Б и пытается захватить ресурс А В один момент времени ресурсом может владеть только один поток. На основании трёх предложений всё понятно. Но это именно обычная ситуация, а не та, которая случается, когда JVM грузит классы. Принципиально в данном случае лишь то, что возникает взаимная зависимость двух задач (которую я и показал). Всё остальное - детали реализации. Если вы реализуете потоки, тогда можно говорить о конфликтующем захвате ресурсов, но вопрос был про JVM, поэтому повторюсь - с какого потолка там потоки? Ладно, совсем коротко - если некие действия зависимы, то зависимость мешает им двигаться свободно, что мы и наблюдаем в случае с загрузкой классов. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2018, 15:52 |
|
Class initialization Deadlock
|
|||
---|---|---|---|
#18+
alex55555questionerНа что Вы обиделись то? Я не обиделся, но попытался указать на необходимость знания деталей реализации JVM. Вы знания не продемонстрировали, но априори утверждаете, что потоки обязательно должны быть. Ведь так? И поэтому я тогда спросил - с какого потолка вы это взяли? Ответа опять нет. Но есть вот рассуждения про обиды. Как связаны реализация JVM и обиды? questionerОбычный дедлок ведь легко объяснить: Поток 1 захватил ресурс А и пытается захватить ресурс Б Поток 2 захватил ресурс Б и пытается захватить ресурс А В один момент времени ресурсом может владеть только один поток. На основании трёх предложений всё понятно. Но это именно обычная ситуация, а не та, которая случается, когда JVM грузит классы. Принципиально в данном случае лишь то, что возникает взаимная зависимость двух задач (которую я и показал). Всё остальное - детали реализации. Если вы реализуете потоки, тогда можно говорить о конфликтующем захвате ресурсов, но вопрос был про JVM, поэтому повторюсь - с какого потолка там потоки? Ладно, совсем коротко - если некие действия зависимы, то зависимость мешает им двигаться свободно, что мы и наблюдаем в случае с загрузкой классов. Ну Вы прям прям Америку открыли. Потревожили великого гуру)) У какого-то там Пангина, который ничего не смыслит слово поток в объяснении присутствует.Но куда уж ему до Вас, о великого) авторДело в том, что согласно §5.5 спецификации JVM у каждого класса есть уникальный initialization lock, который захватывается на время инициализации. Когда другой поток попытается обратиться к инициализируемому классу, он будет заблокирован на этом локе до завершения инициализации первым потоком. При конкурентной инициализации нескольких ссылающихся друг на друга классов нетрудно наткнуться на взаимную блокировку. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 11:44 |
|
Class initialization Deadlock
|
|||
---|---|---|---|
#18+
questionerУ какого-то там Пангина, который ничего не смыслит слово поток в объяснении присутствует.Но куда уж ему до Вас, о великого) Умеющий читать да прочитает. Но вы же не умеете, правда? Всё мною выше сказанное остаётся в силе, ну а если некто предпочитает Панагина - пусть у него и спрашивает. Хотя здесь даже спрашивать нет нужды - вижу просто неумение читать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 14:14 |
|
Class initialization Deadlock
|
|||
---|---|---|---|
#18+
alex55555questionerУ какого-то там Пангина, который ничего не смыслит слово поток в объяснении присутствует.Но куда уж ему до Вас, о великого) Умеющий читать да прочитает. Но вы же не умеете, правда? Всё мною выше сказанное остаётся в силе, ну а если некто предпочитает Панагина - пусть у него и спрашивает. Хотя здесь даже спрашивать нет нужды - вижу просто неумение читать. Спасибо за совет) уже так и сделал. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 16:14 |
|
|
start [/forum/topic.php?fid=59&msg=39744950&tid=2121604]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
130ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 365ms |
total: | 592ms |
0 / 0 |