{"id":489049,"date":"2026-07-29T13:32:26","date_gmt":"2026-07-29T13:32:26","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=489049"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=489049","title":{"rendered":"IllegalMonitorStateException. \u041a\u0440\u0430\u0441\u0438\u043c \u043a\u043e\u0434 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0415\u0432\u0433\u0435\u043d\u0438\u0439, \u044f &#8212; Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0438 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u043e\u0431\u043e\u0439, \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0431\u0435\u0441\u0441\u043e\u043d\u043d\u044b\u0435 \u043d\u043e\u0447\u0438 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0438\u0441\u0442\u0438\u043d\u044b, \u0430 SRE-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d Post Mortem. \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f, \u0432\u0435\u0434\u044c \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0431\u0430\u0433\u0430\u0445 JDK, \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 JVM \u0438 JIT, \u043e \u043a\u043e\u0432\u0430\u0440\u0441\u0442\u0432\u0435 API \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439, \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u043f\u043e\u0434\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u044b.<\/p>\n<blockquote>\n<p>\u0412\u0430\u0436\u043d\u043e<\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<\/p>\n<ul>\n<li>\n<p>OpenJDK 17<\/p>\n<\/li>\n<li>\n<p>Spring Kafka 2.8.11.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u044d\u0442\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u0442.\u043a \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u0432 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0431\u0430\u0433\u0430 \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u043e\u043c ( \u0445\u043e\u0442\u044f \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u043a\u0430\u043a \u0448\u043f\u0438\u043e\u043d\u0441\u043a\u0438\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0432), \u0430 \u0432 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043d\u043e\u0432\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u0445 \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u043c\u044b\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0438 \u0442\u0440\u0430\u0431\u043b\u0448\u0443\u0442\u0438\u043d\u0433\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u044e \u0441\u043a\u0435\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0442\u0435\u0437\u0438\u0441\u0430\u043c \u0430\u0432\u0442\u043e\u0440\u0430. \u0415\u0433\u043e \u043c\u043d\u0435\u043d\u0438\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0439 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438. \u0412\u0441\u0435 \u0432\u043e\u0437\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \ud83d\ude42<\/p>\n<\/blockquote>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0430\u0447\u0430\u0442\u044c \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0435 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0430 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439, \u0430 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0442\u0432\u0438\u0441\u0442 \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u043e\u043d\u0446\u0443 \u043c\u043e\u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430.<\/p>\n<p>\u041d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0441 2015 \u0433\u043e\u0434\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0436\u0435, \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0432\u0448\u0430\u044f \u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u043e\u0439, \u0441\u0442\u0430\u0442\u044c\u044f \u0411\u043e\u0431\u0430 \u041d\u0438\u0441\u0442\u0440\u043e\u043c\u0430 &#171;\u041a\u0430\u043a\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0432\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f?&#187; (<a href=\"https:\/\/journal.stuffwithstuff.com\/2015\/02\/01\/what-color-is-your-function\/\">Bob Nystrom &#171;What Color Is Your Function?&#187;<\/a>). \u042f \u043d\u0435 \u0441\u0442\u0430\u0432\u043b\u044e \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u0442\u0435\u043c\u0435:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/466337\/\">https:\/\/habr.com\/ru\/articles\/466337\/<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/vk\/articles\/691828\/\">https:\/\/habr.com\/ru\/companies\/vk\/articles\/691828\/<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u044b \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b. \u0421\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0443 \u0431\u043e\u043b\u044c\u043d\u043e (\u0438\u043b\u0438 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u043e \u043a\u043e\u0434\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a \u043e \u0435\u0434\u0438\u043d\u0438\u0446\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438):<\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0446\u0432\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>\u0426\u0432\u0435\u0442 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212;\u00a0<strong>\u043a\u0440\u0430\u0441\u043d\u044b\u0435<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041a\u0440\u0430\u0441\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u043e\u043b\u044c\u043d\u0435\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0430\u0441\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043a\u0440\u0430\u0441\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#187; \u0437\u0430\u0440\u0430\u0437\u043d\u044b\u0435&#187;. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0441\u00a0<code>suspend fun<\/code>\u00a0\u0432 Kotlin \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442 \u0432\u0435\u0441\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0435\u0435 \u043a\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u00a0<code>suspend<\/code>\u00a0\u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u0443\u043f\u0440\u0435\u043c\u0441\u044f \u0432\u00a0<code>runBlocking<\/code>\u00a0\u0431\u043b\u043e\u043a.<\/p>\n<p>\u041d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0442\u0435\u043c\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c <em>\u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u0444\u0430\u043a\u0442<\/em>. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0435 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d &#8212; stackful coroutines (fiber, green thread, virtual thread, user-mode thread, goroutine) \u0438 stackless coroutines (state machine, coroutine).<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e stackful coroutine \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435. \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 user space, \u0431\u0435\u0437 \u0443\u0447\u0430\u0441\u0442\u0438\u044f \u044f\u0434\u0440\u0430 \u041e\u0421, \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e, \u0442.\u0435. \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u043a\u043e\u0434\u043e\u043c, \u0430 \u043d\u0435 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u043c \u044f\u0434\u0440\u0430.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e stackless coroutines \u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043b\u043e async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 live-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u0443\u044e suspend \u0442\u043e\u0447\u043a\u0443 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 (state machine). \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438.<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 &#171;\u0446\u0432\u0435\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439&#187; \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u044f\u0437\u044b\u043a\u0430\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434 stackless coroutines.<\/p>\n<p>\u0414\u043b\u044f \u0447\u0435\u0433\u043e \u044f \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b \u044d\u0442\u043e \u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u043e\u0435 \u0447\u0442\u0438\u0432\u043e? \u0414\u0430\u0432\u0430\u0439\u0442\u0435\u00a0<em>\u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043c<\/em>, \u0447\u0442\u043e \u043a\u043e\u0434 \u0438\u043c\u0435\u0435\u0442 &#171;\u0446\u0432\u0435\u0442&#187;. \u0418 \u0438\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0430 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u0447\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0438 \u0434\u043b\u044f stackless, \u0438 \u0434\u043b\u044f stackful \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/h3>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435 \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438). \u041e\u043d \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u0432 Spring Kafka Template \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438:<\/p>\n<pre><code class=\"kotlin\">    private fun sendEventToKafka(    message: Message&lt;V&gt;,    mdcContextMap: Map&lt;String, String&gt;?,) {    kafkaTemplate.send(message).apply {        processCallback(mdcContextMap)    }}private fun ListenableFuture&lt;SendResult&lt;K, V&gt;&gt;.processCallback(    mdcContextMap: Map&lt;String, String&gt;?,) {    addCallback({        if (mdcContextMap != null) MDC.setContextMap(mdcContextMap)        logger.info { \"Message $eventName successfully sent to kafka\" }    }, {        if (mdcContextMap != null) MDC.setContextMap(mdcContextMap)        logger.error(it) { \"Failed to send $eventName to kafka: ${it.message}\" }    })}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u0441\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u041d\u0430 error \u0432\u0435\u0442\u043a\u0435 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0430 \u043b\u043e\u0432\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u043f\u0438\u0448\u0435\u043c ERROR \u043b\u043e\u0433. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439, \u0442.\u043a. \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u0435\u043d. \u042f \u0432\u0438\u0434\u0435\u043b \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u044f \u043d\u0435 \u043f\u0440\u0430\u0432, \u043f\u0440\u043e\u0448\u0443 \u0442\u0435\u0431\u044f, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0432\u043e\u0437\u0440\u0430\u0437\u0438\u0442\u044c \u043c\u043d\u0435).<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430\u0441 \u0436\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u044e\u0436\u0435\u0442\u043d\u044b\u0439 \u0442\u0432\u0438\u0441\u0442. \u0412 \u0442\u0430\u043a\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438\u00a0<strong>\u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430<\/strong>\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u0418 \u044d\u0442\u043e, \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u0432\u0438\u043d\u0430 API Spring Kafka. \u0427\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0447\u0435\u043c\u0443. \u041d\u0430\u043f\u043e\u043c\u043d\u044e \u043e\u0434\u043d\u0443 \u0432\u0430\u0436\u043d\u0443\u044e \u0434\u0435\u0442\u0430\u043b\u044c:\u00a0<code>kafkaTemplate.send(message)<\/code>\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0<code>CompletableFuture<\/code>\/<code>ListenableFuture<\/code>, \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043e \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<p>\u0412 \u0447\u0435\u043c \u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430? \u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u0430\u0444\u043a\u0430-\u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435\u00a0<code>IllegalMonitorStateException: current thread is not owner<\/code>. \u041f\u0440\u0438\u0447\u0435\u043c \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0439\u043c\u0430\u0435\u043c \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443 \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043a\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440. \u0415\u0449\u0435 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u043e\u0434 \u0432\u044b\u0448\u0435 \u0438 \u0437\u0430\u0434\u0430\u0439\u0442\u0435 \u0441\u0435\u0431\u0435 \u0432\u043e\u043f\u0440\u043e\u0441: &#171;\u0427\u0442\u043e \u0436\u0435 \u0432 \u043d\u0435\u043c \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e?&#187;.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/690\/57f\/0e7\/69057f0e72dee14c72a74011bc2bf4d0.png\" width=\"1497\" height=\"809\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/690\/57f\/0e7\/69057f0e72dee14c72a74011bc2bf4d0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/690\/57f\/0e7\/69057f0e72dee14c72a74011bc2bf4d0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u041f\u043e\u0438\u0441\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/h3>\n<p>\u041f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u0443\u0431\u0435\u0436\u0430\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043b\u043e\u0433\u0438 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u043e\u0432 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0443\u044e \u0434\u0435\u0442\u0430\u043b\u044c. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441 \u043e\u0448\u0438\u0431\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b:<\/p>\n<pre><code class=\"text\">at PlannerUseCase$makeDecisionsByTasksAsync$1.invokeSuspend(PlannerUseCase.kt:130) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u044d\u0442\u043e \u0432\u0441\u0435 \u043c\u0435\u043d\u044f\u0435\u0442. \u0412\u0435\u0434\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u0440\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0435 \u0442\u0443\u0434\u0430 (\u0447\u0442\u043e, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439).<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443. \u041a\u0430\u043a\u0438\u0435 \u0442\u0435\u0437\u0438\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u041c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c KafkaTemplate \u0432 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0435<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0432\u044b\u0437\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>API \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439. \u0412\u0441\u043f\u043e\u043c\u043d\u0442\u0435, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0<code>kafkaTemplate.send(message)<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0435\u0440 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f &#8212;\u00a0<a href=\"http:\/\/Dispatchers.IO\"><code>Dispatchers.IO<\/code><\/a>.<\/p>\n<pre><code class=\"kotlin\">    private suspend fun sendEventToKafka(    message: Message&lt;V&gt;,    mdcContextMap: Map&lt;String, String&gt;?) {    withContext(Dispatchers.IO + MDCContext()) {        kafkaTemplate.send(message).apply {            processCallback(mdcContextMap = mdcContextMap)        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e, \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u044d\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0418\u043d\u0430\u0447\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u0432\u043e\u0434\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0435\u043b\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \ud83d\ude42<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438\u00a0<a href=\"http:\/\/Dispatchers.IO\"><code>Dispatchers.IO<\/code><\/a>\u00a0\u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f\u00a0<strong>\u0441\u0442\u0440\u043e\u0433\u043e \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0442\u0440\u0435\u0434\u0435<\/strong>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u0435\u0440\u044f\u0442\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440. \u0411\u043b\u0430\u0433\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0435\u0440 \u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f.<\/p>\n<pre><code class=\"kotlin\">    private suspend fun sendEventToKafka(    message: Message&lt;V&gt;,    mdcContextMap: Map&lt;String, String&gt;?) {    withContext(Dispatchers.Unconfined + MDCContext()) {        kafkaTemplate.send(message).apply {            processCallback(mdcContextMap = mdcContextMap)        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e\u0436,\u00a0<code>Dispatchers.Unconfined<\/code>\u00a0\u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u043e\u043c\u043e\u0433. \u0418 \u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u043b\u0438, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c,\u00a0<em>\u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0435<\/em>\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c (\u0435\u0441\u043b\u0438 \u0442\u044b, \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u043d\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d &#8212; \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u044e \u0442\u0435\u0431\u044f \u043a \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044e). \u0417\u043d\u0430\u0447\u0438\u0442, \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0430\u0441 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0433\u043b\u0443\u0431\u0436\u0435 \u0438\u043b\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435.<\/p>\n<h3>\u041a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 API Spring Kafka<\/h3>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0430\u0441 \u0443\u0442\u043e\u043c\u043b\u044f\u0442\u044c \u0431\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u043a\u043e\u0434\u0443 Spring Kafka, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443.<\/p>\n<pre><code class=\"java\">\/\/ org.apache.kafka.clients.producer.KafkaProducerprivate ClusterAndWaitTime waitOnMetadata(String topic, Integer partition, long nowMs,    long maxWaitMs) throws InterruptedException {  \/\/...  try {    metadata.awaitUpdate(version, remainingWaitMs);  } catch (TimeoutException ex) {    \/\/ Rethrow with original maxWaitMs to prevent logging exception with remainingWaitMs    throw new TimeoutException(        String.format(\"Topic %s not present in metadata after %d ms.\",            topic, maxWaitMs));  }  \/\/...  return new ClusterAndWaitTime(cluster, elapsed);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u0436\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 Spring, \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435 Kafka Producer, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u00a0<code>waitOnMetadata(...)<\/code>\u00a0\u0438 \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u00a0<code>awaitUpdate()<\/code>\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u0443\u00a0<code>Metadata<\/code>. \u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b \u0430\u043d\u0430\u043b\u0438\u0437 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0441\u044e\u0434\u0430, \u0442.\u043a. \u043a\u043e\u0433\u0434\u0430 \u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0441\u043b\u043e\u0432\u043e\u00a0<strong>wait<\/strong>\u00a0\u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u0435\u043d\u044f \u043d\u0430\u0441\u0442\u043e\u0440\u043e\u0436\u0438\u043b\u043e. \u041f\u043e\u0447\u0435\u043c\u0443? \u042f \u0432\u0430\u043c \u043d\u0430\u043f\u043e\u043c\u043d\u044e &#8212; API Spring Kafka \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439, \u0432\u0435\u0434\u044c \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0<code>CompletableFuture<\/code>\/<code>ListenableFuture<\/code>.<\/p>\n<p>\u041a\u043e\u0434\u00a0<code>ProducerMetadata<\/code>\u00a0(\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00a0<code>Metadata<\/code>):<\/p>\n<pre><code class=\"java\">\/\/ org.apache.kafka.clients.producer.internals.ProducerMetadatapublic synchronized void awaitUpdate(final int lastVersion, final long timeoutMs)    throws InterruptedException {  long currentTimeMs = time.milliseconds();  long deadlineMs = currentTimeMs + timeoutMs &lt; 0 ? Long.MAX_VALUE : currentTimeMs + timeoutMs;  time.waitObject(this, () -&gt; {    \/\/ Throw fatal exceptions, if there are any. Recoverable topic errors will be handled by the caller.    maybeThrowFatalException();    return updateVersion() &gt; lastVersion || isClosed();  }, deadlineMs);  if (isClosed())    throw new KafkaException(\"Requested metadata update after close\");}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0451 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c. \u041c\u044b \u0432\u0438\u0434\u0438\u043c\u00a0<code>synchronized<\/code>-\u0431\u043b\u043e\u043a. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c JavaDoc, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u00a0<code>waitOnMetadata(...)<\/code>\u00a0\u0432 \u043a\u043b\u0430\u0441\u0441\u0435\u00a0<code>KafkaProducer<\/code>\u00a0\u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0431\u0440\u043e\u043a\u0435\u0440\u0430\u0445 Kafka. \u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0438, \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. \u041a\u0430\u043a \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u041e\u0448\u0438\u0431\u043a\u0438 \u0441\u0435\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0437\u043d\u0430\u0447\u0438\u0442?<\/p>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, API Spring Kafka \u043d\u0430\u0441 \u043e\u0431\u043c\u0430\u043d\u044b\u0432\u0430\u0435\u0442 \u0438\u043b\u0438, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c,\u00a0<em>\u043d\u0435\u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0435\u0442<\/em>:<\/p>\n<ol>\n<li>\n<p>\u041d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u044f\u0432\u043d\u043e \u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a \u044f \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435 &#8212; \u043d\u0430\u0448\u0438 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">    private fun sendEventToKafka(    message: Message&lt;V&gt;,    mdcContextMap: Map&lt;String, String&gt;?,) {    kafkaTemplate.send(message).apply {        processCallback(mdcContextMap)    }}private fun ListenableFuture&lt;SendResult&lt;K, V&gt;&gt;.processCallback(    mdcContextMap: Map&lt;String, String&gt;?,) {    addCallback({        if (mdcContextMap != null) MDC.setContextMap(mdcContextMap)        logger.info { \"Message $eventName successfully sent to kafka\" }    }, {        if (mdcContextMap != null) MDC.setContextMap(mdcContextMap)        logger.error(it) { \"Failed to send $eventName to kafka: ${it.message}\" }    })}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u044f \u044d\u0442\u0430 \u043b\u043e\u0433\u0438\u043a\u0430, \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00a0<strong>\u0434\u043e<\/strong>\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u00a0<code>Future<\/code>. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u0438\u043b\u0438 \u043b\u043e\u0433 \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u0442\u043e\u0439, \u044d\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438. \u041d\u0443\u0436\u043d\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u00a0<code>kafkaTemplate.send(message)<\/code>\u00a0\u0432 try-catch, \u0438\u043d\u0430\u0447\u0435 \u043c\u044b \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c error rate \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430.<\/p>\n<pre><code class=\"kotlin\">    private fun sendEventToKafka(    message: Message&lt;V&gt;,    mdcContextMap: Map&lt;String, String&gt;?) {    runCatching {        kafkaTemplate.send(message).apply {            processCallback(mdcContextMap = mdcContextMap)        }    }.getOrElse {        \/*        * \u0411\u043b\u043e\u043a \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0421\u043c\u043e\u0442\u0440\u0438:        * org.apache.kafka.clients.producer.KafkaProducer.waitOnMetadata(KafkaProducer.java:1149) -&gt;        * org.apache.kafka.clients.producer.internals.ProducerMetadata.awaitUpdate(ProducerMetadata.java:120) -&gt;        * org.apache.kafka.common.utils.SystemTime.waitObject(SystemTime.java:55)        * *\/        logger.error(it) {            \"Failed kafka template send method invocation for event $eventName: ${it.message}}\"        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 \u0441\u0430\u043c\u0438 \u0441\u0435\u0431\u0435 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441: &#171;\u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e (\u043a\u043e\u043d\u0442\u0440)\u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e?&#187;. \u0427\u0442\u043e \u0431\u044b \u0432\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 \u0440\u0435\u0432\u044c\u044e \u043a\u043e\u0434\u0430, \u0435\u0441\u043b\u0438 \u0431\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e try-catch \u0438 \u043a\u043e\u043b\u043b\u0431\u044d\u043a? \u041e\u0441\u0442\u0430\u0432\u043b\u044e \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c.<\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0440\u0430\u0437\u0431\u043e\u0440.<\/p>\n<pre><code class=\"java\">\/\/ org.apache.kafka.clients.producer.internals.ProducerMetadatapublic synchronized void awaitUpdate(final int lastVersion, final long timeoutMs)    throws InterruptedException {  \/\/...  time.waitObject(this, () -&gt; {    \/\/...  }, deadlineMs);  \/\/...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>synchronized<\/code>-\u0431\u043b\u043e\u043a \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u0435\u0442\u043e\u0434\u0430. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0442.\u0435.\u00a0<code>metadata<\/code>. \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u00a0<code>time.waitObject(...)<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c\u00a0<code>this<\/code>\u00a0(\u0442.\u0435.\u00a0<code>metadata<\/code>) \u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043b\u044f\u043c\u0431\u0434\u0443.<\/p>\n<p>\u041a\u043e\u0434\u00a0<code>SystemTime<\/code>\u00a0(\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00a0<code>Time<\/code>):<\/p>\n<pre><code class=\"java\">  public void waitObject(Object obj, Supplier&lt;Boolean&gt; condition, long deadlineMs)    throws InterruptedException {  synchronized (obj) {    while (true) {      if (condition.get())        return;      long currentTimeMs = milliseconds();      if (currentTimeMs &gt;= deadlineMs)        throw new TimeoutException(\"Condition not satisfied before deadline\");      obj.wait(deadlineMs - currentTimeMs);    }  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d\u00a0<code>synchronized<\/code>-\u0431\u043b\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0436\u0435\u00a0<strong>\u044f\u0432\u043d\u043e<\/strong>\u00a0\u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438 \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u044d\u0442\u043e\u00a0<code>metadata<\/code>. \u0410 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0446\u0438\u043a\u043b\u0430\u00a0<code>while (true)<\/code>\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u00a0<code>obj.wait(...)<\/code>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u00a0<code>metadata<\/code>, \u0442.\u0435. \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u043c\u0441\u044f.<\/p>\n<p>\u0418 \u0432\u043e\u0442, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u043f\u0440\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u0445 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u0442\u0430\u043a \u0432 \u044d\u0442\u043e\u043c \u0443\u0432\u0435\u0440\u0435\u043d?<\/p>\n<ol>\n<li>\n<p>\u041e\u0448\u0438\u0431\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u0431\u043e\u0435\u0432 \u0438\u043b\u0438 \u043c\u0438\u043d\u0443\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u043d\u0438\u0442\u043e\u0440 \u0442\u0435\u0440\u044f\u043b\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u00a0<code>metadata<\/code>.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0413\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0427\u0442\u043e \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438 \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435:<\/p>\n<ol>\n<li>\n<p>\u0421\u043c\u0435\u043d\u0430 \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0435\u0440\u043e\u0432 \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442<\/p>\n<\/li>\n<li>\n<p><code>KafkaTemplate<\/code>\u00a0Spring Kafka \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u0441\u044f\u00a0<strong>\u0434\u0432\u043e\u0439\u043d\u044b\u043c<\/strong>\u00a0<code>synchronized<\/code>-\u0431\u043b\u043e\u043a\u043e\u043c \u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0432\u0441\u0435. \u041d\u0438 \u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0431\u0440\u043e\u0441\u0430 \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435 \u0434\u0430\u0435\u0442. \u0421\u043c\u0443\u0449\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e &#8212; double synchronized \u0442\u0435\u0445\u043d\u0438\u043a\u0430. \u0413\u0434\u0435-\u0442\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0438\u043d\u0442\u0443\u0438\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 &#171;\u0432\u0438\u0436\u0443 double synchronized &#8212; \u0436\u0434\u0443 \u043f\u043e\u0434\u0432\u043e\u0445\u0430&#187; (\u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043e\u043f\u044b\u0442 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u0430\u0435\u0442 \u043e \u0441\u0435\u0431\u0435 \u0437\u043d\u0430\u0442\u044c).<\/p>\n<p>\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c Google \u043d\u0430\u0441\u0447\u0435\u0442 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b?\u00a0<a href=\"https:\/\/issues.apache.org\/jira\/browse\/KAFKA-10902\">\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0438\u043a\u0435\u0442<\/a>\u00a0\u0432 Jira Kafka, \u0442\u0430\u043c \u043e\u043f\u0438\u0441\u0430\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u0448 \u043a\u0435\u0439\u0441. \u0423\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0441\u00a0<code>Metadata<\/code>. \u0423 \u043d\u0430\u0441 \u0442\u0435\u043f\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0435\u0436\u0434\u0430 \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u043d\u043e \u0442\u0438\u043a\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 Open \u0441 2021 \u0433\u043e\u0434\u0430, \u0438 \u0434\u0438\u0441\u043a\u0443\u0441\u0441\u0438\u044f \u043f\u043e \u043d\u0435\u043c\u0443 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u0430 \u0432 22-\u043c \u0433\u043e\u0434\u0443.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u0431\u0430\u0433 \u0442\u0430\u043a\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0438\u043a\u0435\u0442\u0435 OpenJDK\u00a0<a href=\"https:\/\/bugs.openjdk.org\/browse\/JDK-8298446\">JDK-8298446<\/a>. \u0418 \u0432 \u043d\u0435\u043c \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0443\u044e\u00a0<strong>\u0437\u0430\u0446\u0435\u043f\u043a\u0443<\/strong>: &#171;\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u00a0<code>KafkaProducer.waitOnMetadata<\/code>. \u0412 \u043b\u043e\u0433\u0435 JIT \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0430\u0436\u0434\u044b: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Kafka (timestamp 1445193), \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b (timestamp 1445640). \u041f\u043e\u0441\u043b\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435\u00a0<code>IllegalMonitorStateException<\/code>.&#187;<\/p>\n<p>\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Kafka \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0<code>TimeoutException<\/code>\u00a0\u043f\u0440\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u0443\u0431\u044c\u0451\u043c \u043d\u0430\u0448 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443 \u043c\u044b \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0438. \u0412\u0441\u0435 \u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0432\u0430\u0436\u0434\u044b? \u041a\u0430\u043a \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0434\u043b\u044f \u0432\u0441\u0435\u0445 JIT-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 CodeCache. \u0410 \u0435\u0441\u043b\u0438 CodeCache \u043c\u0430\u043b, JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0447\u0430\u0449\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0437-\u0437\u0430 \u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0447\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0431\u0430\u0433\u043e\u0432, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>\u041a\u0430\u043a\u0438\u0435 \u0436\u0435 \u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e \u0435\u0441\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/wiki.openjdk.org\/display\/HotSpot\/Inlining\">\u041b\u044f\u043c\u0431\u0434\u044b \u0438\u043d\u043b\u0430\u0439\u043d\u044f\u0442\u0441\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/wiki.openjdk.org\/spaces\/HotSpot\/pages\/11829250\/EscapeAnalysis\">Escape-\u0430\u043d\u0430\u043b\u0438\u0437<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u00ab\u0443\u0431\u0435\u0433\u0430\u0435\u0442\u00bb \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043c\u0435\u0442\u043e\u0434\u0430\/\u043f\u043e\u0442\u043e\u043a\u0430 (\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043b\u0438 \u0438\u0437\u0432\u043d\u0435). \u0418 \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0438\u0437 \u043d\u0435\u0433\u043e:<\/p>\n<ol>\n<li>\n<p>\u0423\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a (\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439\u00a0<code>monitorenter<\/code>\u00a0\u0438\u00a0<code>monitorexit<\/code>)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.oracle.com\/cd\/E19253-01\/816-5137\/ggecq\/index.html\">Spinlock-style locking<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u043e, \u0447\u0435\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043d\u0430\u0448 \u0441\u043b\u043e\u0436\u043d\u044b\u0439, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043b\u044f\u043c\u0431\u0434 \u0438\u00a0<code>synchronized<\/code>-\u0431\u043b\u043e\u043a\u043e\u0432. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8bc\/1e7\/c54\/8bc1e7c547b209261c2976f0bfc9833d.png\" width=\"2213\" height=\"1109\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/8bc\/1e7\/c54\/8bc1e7c547b209261c2976f0bfc9833d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8bc\/1e7\/c54\/8bc1e7c547b209261c2976f0bfc9833d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0441 \u043b\u044f\u043c\u0431\u0434\u0430\u043c\u0438 \u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0432\u0441\u0451 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0442\u043e \u0432\u043e\u0442 \u0432 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0432\u0435\u0440\u0438\u0442\u0441\u044f \u0441 \u0442\u0440\u0443\u0434\u043e\u043c, \u0435\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0432\u0435\u0440\u043d\u044b \u043b\u0438 \u043b\u0438 \u044d\u0442\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h4>Lock Elision<\/h4>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<pre><code class=\"java\">public class Main {  private static int counter = 0;  private static void perform() {    Object lock = new Object();    synchronized (lock) {      counter++; \/\/ \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430    }  }  static void main(String[] args) {    for (int i = 0; i &lt; 1_000_000; i++) {      perform();    }    System.out.println(counter);  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<blockquote>\n<p>\u0412\u0430\u0436\u043d\u043e<\/p>\n<p>\u0412\u0441\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u041c\u0438\u043b\u043b\u0438\u043e\u043d \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438<\/p>\n<\/blockquote>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441 \u0444\u043b\u0430\u0433\u0430\u043c\u0438:<\/p>\n<pre><code class=\"text\">-XX:+UnlockDiagnosticVMOptions-XX:-EliminateLocks \/\/ \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f-XX:+PrintAssembly-XX:CompileCommand=compileonly,Main::perform<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f Lock Elision \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u00a0<strong>\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430<\/strong>.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4e9\/da7\/437\/4e9da7437d6937418c46b817923b7342.png\" width=\"2975\" height=\"2090\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4e9\/da7\/437\/4e9da7437d6937418c46b817923b7342.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4e9\/da7\/437\/4e9da7437d6937418c46b817923b7342.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u043f\u043e\u0440\u0442\u044f\u043d\u043a\u0443. \u0422\u0443\u0442 \u0432\u0438\u0434\u0435\u043d \u043b\u0438\u0448\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0443\u0441\u043e\u043a. \u041d\u043e \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u044f \u0438\u0445 \u0434\u043b\u044f \u0432\u0430\u0441 \u043b\u044e\u0431\u0435\u0437\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u043b.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1cc\/afc\/bb3\/1ccafcbb389fd3bb9ecd90137975fa2c.png\" width=\"1825\" height=\"1509\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1cc\/afc\/bb3\/1ccafcbb389fd3bb9ecd90137975fa2c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1cc\/afc\/bb3\/1ccafcbb389fd3bb9ecd90137975fa2c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f Lock Elision \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430. \u0412\u0438\u0434\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u043e\u043c, \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 x86-64 \u0431\u0430\u0439\u0442\u044b (<code>41 ff 42 70<\/code>) &#8212; \u044d\u0442\u043e \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434, \u043d\u043e \u0441 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u043c\u0430\u0433\u0438\u044e!<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/243\/8ea\/107\/2438ea107359b75c55afd2e10e240139.png\" width=\"1836\" height=\"1493\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/243\/8ea\/107\/2438ea107359b75c55afd2e10e240139.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/243\/8ea\/107\/2438ea107359b75c55afd2e10e240139.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430 \u043d\u0435\u0442! \u0412\u0438\u0434\u043d\u0430 \u043e\u0442\u043c\u0435\u0442\u043a\u0430\u00a0<code>safepoint poll<\/code>\u00a0&#8212; \u0448\u0442\u0430\u0442\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e HotSpot \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434. \u041d\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u00a0<code>safepoint<\/code>, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439\u00a0<code>monitorenter<\/code>\/<code>monitorexit<\/code>\u00a0&#8212; \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0430. \u0418\u043d\u0442\u0440\u0438\u0433\u0443\u044e\u0449\u0435? \u041b\u0438\u0447\u043d\u043e \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0434\u0430.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u044f\u043c\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043d\u0430\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/master\/test\/hotspot\/jtreg\/compiler\/escapeAnalysis\/TestEliminateAllocation.java\">\u0422\u0435\u0441\u0442<\/a>\u00a0\u043f\u0440\u044f\u043c\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 OpenJDK, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e Escape Analysis \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435\u00a0<code>escapes<\/code>\u00a0\u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/shipilev.net\/jvm\/anatomy-quarks\/19-lock-elision\/\">\u0422\u0435\u0441\u0442<\/a>\u00a0Lock Elision \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 JMH \u043e\u0442 \u0410\u043b\u0435\u043a\u0441\u0435\u044f \u0428\u0438\u043f\u0438\u043b\u0451\u0432\u0430.<\/p>\n<\/li>\n<\/ul>\n<h4>Spinlock<\/h4>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u00a0<a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/master\/test\/hotspot\/jtreg\/vmTestbase\/jit\/escape\/AdaptiveBlocking\/AdaptiveBlocking001\/AdaptiveBlocking001.java\">\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f<\/a>, \u043a\u043e\u0433\u0434\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 \u043b\u0435\u0433\u0447\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0442\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0442\u0430\u043a \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 &#8212; \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0438\u0437\u043a\u0430\u044f, \u0438 \u0440\u0435\u0441\u0443\u0440\u0441 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0435\u0441\u043b\u0438 \u0441 \u0441\u0435\u0442\u044c\u044e \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442,\u00a0<a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/master\/test\/hotspot\/jtreg\/runtime\/logging\/MonitorInflationTest.java\">\u0432\u044b\u0441\u043e\u043a\u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c<\/a>, \u0447\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0432 \u0434\u0435\u0448\u0451\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 stack-locking (\u0431\u044b\u0441\u0442\u0440\u044b\u0439 CAS-\u0437\u0430\u0445\u0432\u0430\u0442), \u0438 \u043d\u0435 \u0434\u043e\u0439\u0434\u0451\u0442 \u0434\u043e \u0438\u043d\u0444\u043b\u044f\u0446\u0438\u0438 \u0432 \u0442\u044f\u0436\u0451\u043b\u044b\u0439\u00a0<code>ObjectMonitor<\/code>. \u0410 \u0441\u0430\u043c\u0430 \u0438\u043d\u0444\u043b\u044f\u0446\u0438\u044f \u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d6c\/aca\/cf4\/d6cacacf423b0b2400c48edf7aa6cd39.png\" width=\"1405\" height=\"1090\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d6c\/aca\/cf4\/d6cacacf423b0b2400c48edf7aa6cd39.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d6c\/aca\/cf4\/d6cacacf423b0b2400c48edf7aa6cd39.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>Inlining<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u044d\u0442\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e, \u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0434\u043b\u044f \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c\u00a0<strong>\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f<\/strong>\u00a0\u043d\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433. \u0412\u043e\u0442 \u043f\u0440\u0443\u0444 \u0438\u0437 \u043a\u043e\u0434\u0430 OpenJDK:<\/p>\n<ul>\n<li>\n<p>9 \u043d\u0430\u00a0<a href=\"https:\/\/github.com\/openjdk\/jdk17u\/blob\/master\/src\/hotspot\/share\/c1\/c1_globals.hpp#L177\">\u0443\u0440\u043e\u0432\u043d\u0435 C1<\/a><\/p>\n<\/li>\n<li>\n<p>15 \u043d\u0430\u00a0<a href=\"https:\/\/github.com\/openjdk\/jdk17u\/blob\/master\/src\/hotspot\/share\/opto\/c2_globals.hpp#L644\">\u0443\u0440\u043e\u0432\u043d\u0435 C2<\/a><\/p>\n<\/li>\n<\/ul>\n<h3>\u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/h3>\n<p>\u0418\u043c\u0435\u044f \u044d\u0442\u0438 \u0437\u043d\u0430\u043d\u0438\u044f, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441: &#171;\u0427\u0442\u043e \u0436\u0435 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?&#187;. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u00a0<strong>\u043b\u044f\u043c\u0431\u0434\u044b<\/strong><\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u00a0<strong>\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e<\/strong>\u00a0\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445\u00a0<code>synchronized<\/code>-\u0431\u043b\u043e\u043a\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f\u00a0<strong>\u0440\u0435\u0434\u043a\u043e<\/strong><\/p>\n<\/li>\n<li>\n<p>\u0421\u0430\u043c \u0440\u0435\u0441\u0443\u0440\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u00a0<strong>\u0431\u044b\u0441\u0442\u0440\u043e<\/strong>\u00a0(\u0434\u043b\u044f \u0441\u0435\u0442\u0438), \u0437\u0430 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c\u00a0<strong>\u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b<\/strong>, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\u00a0<code>kotlinx.coroutines<\/code>, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u043b\u044f\u043c\u0431\u0434\u0430-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"text\">at kafka.BaseKafkaProducer$sendEventToKafka$2.invokeSuspend(BaseKafkaProducer.kt:73) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:367) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25) at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:172) at kotlinx.coroutines.BuildersKt.withContext(Unknown Source) at kafka.BaseKafkaProducer.sendEventToKafka(BaseKafkaProducer.kt:71)...at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108) at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:280) at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59) at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38) at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u043b\u044f\u043c\u0431\u0434\u0430-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u0442\u0430\u043a\u0438\u043c \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 CodeCache (\u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430). \u041f\u0440\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439\u00a0<em>\u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/em>\u00a0\u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 JIT \u0437\u0430\u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0442\u044c \u043a\u043e\u0434, \u0430 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/af1\/2bf\/4bf\/af12bf4bf84d465db97e7cd305273358.png\" width=\"2213\" height=\"1109\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/af1\/2bf\/4bf\/af12bf4bf84d465db97e7cd305273358.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/af1\/2bf\/4bf\/af12bf4bf84d465db97e7cd305273358.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 (\u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u0440\u0443\u043a\u0430\u043c\u0438):<\/p>\n<ul>\n<li>\n<p>\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u00a0<em>\u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/em>\u00a0\u0440\u0435\u0437\u043a\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0433\u0440\u0435\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u043a\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u0432 \u043b\u0438\u043c\u0438\u0442\u044b\u00a0<code>max inline<\/code>\u00a0\u043d\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (C1\/C2)<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 CodeCache \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>JIT \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u044d\u0442\u043e \u043d\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0435 JVM:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f50\/6b0\/540\/f506b0540d03f5d6fa74c200112f476e.png\" width=\"3048\" height=\"795\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f50\/6b0\/540\/f506b0540d03f5d6fa74c200112f476e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f50\/6b0\/540\/f506b0540d03f5d6fa74c200112f476e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u0443 \u043c\u044b \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c: &#171;\u0433\u0443\u043b\u044f\u044e\u0449\u0438\u0439&#187; CodeCache (\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438\/\u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438).<\/p>\n<p>JIT \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043d\u0430\u0448\u0443 \u043b\u044f\u043c\u0431\u0434\u0443. \u0418 \u0437\u0434\u0435\u0441\u044c \u0436\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0430 \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442 \u00ab\u043b\u0451\u0433\u043a\u043e\u0439\u00bb \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u043a \u0442\u044f\u0436\u0435\u043b\u043e\u0439, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0443, \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u043c\u0441\u044f. \u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u044d\u0442\u043e:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95f\/2e2\/02b\/95f2e202bd891179b03c188a73ba6bb5.png\" width=\"2213\" height=\"1109\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/95f\/2e2\/02b\/95f2e202bd891179b03c188a73ba6bb5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95f\/2e2\/02b\/95f2e202bd891179b03c188a73ba6bb5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0441\u0442\u0430\u0440\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: \u0432\u0435\u0434\u044c \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043c\u044b \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0442\u0435\u0440\u044f\u0435\u043c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430, \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u00a0<strong>\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e<\/strong>.<\/p>\n<p>\u0418 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u043c\u0435\u043d\u0430 \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0435\u0440\u043e\u0432 \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442. \u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u041f\u0443\u043b \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0435\u0440\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a (<a href=\"http:\/\/Dispatcher.IO\"><code>Dispatcher.IO<\/code><\/a>\u00a0\u2013 64 \u043f\u043e\u0442\u043e\u043a\u0430)<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0435\u043c \u0441\u0442\u0430\u0440\u0442\u0443\u044e\u0442 \u0432\u00a0<strong>\u0442\u0435\u0445 \u0436\u0435<\/strong>\u00a0\u043f\u043e\u0442\u043e\u043a\u0430\u0445<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u043e\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u0441 \u0431\u0438\u0442\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0418 \u043a\u0430\u043a \u0432\u0438\u0448\u0435\u043d\u043a\u0430 \u043d\u0430 \u0442\u043e\u0440\u0442\u0435, \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0432\u044b\u0448\u0435\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u0443\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c (\u0436\u0434\u0443 \u0432\u0430\u0441 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043f\u043e\u0447\u0435\u043c\u0443): \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 Reddit\u00a0<a href=\"https:\/\/www.reddit.com\/r\/apachekafka\/comments\/12xk3pr\/illegalmonitorstateexception\/\">\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b<\/a>\u00a0\u043a\u043e\u0434\u00a0<code>ProducerMetadata.awaitUpdate()<\/code>\u00a0\u0431\u0435\u0437 \u043b\u044f\u043c\u0431\u0434\u0430-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0441\u043c\u043e\u0433 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0431\u0430\u0433\u0430.<\/p>\n<h3>\u0424\u0438\u043a\u0441<\/h3>\n<p>\u041a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0444\u0438\u043a\u0441? \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c &#171;\u0432\u044b\u0434\u043e\u0445\u043d\u0443\u0442\u044c&#187; JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0441\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u043c\u0435\u0449\u0430\u043b\u0441\u044f \u0432 CodeCache \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043d\u0435 \u0432\u043b\u0438\u044f\u043b \u043d\u0430 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e ( \u0435\u0441\u043b\u0438 \u0434\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0443\u0436\u043d\u044b).<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/554\/79c\/61f\/55479c61fc4b4e2656307e7271be6d2c.png\" width=\"3013\" height=\"812\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/554\/79c\/61f\/55479c61fc4b4e2656307e7271be6d2c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/554\/79c\/61f\/55479c61fc4b4e2656307e7271be6d2c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u041d\u043e\u0432\u0430\u044f \u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/h3>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b &#8212; \u0431\u0430\u0433 \u0432 OpenJDK, \u043d\u043e\u00a0<em>\u0442\u0440\u0438\u0433\u0433\u0435\u0440<\/em>\u00a0&#8212; \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d. \u0410 \u043d\u0443\u0436\u043d\u044b \u043b\u0438 \u043e\u043d\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438?<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u0442\u043e \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a \u0432\u043e\u043f\u0440\u043e\u0441 \u043a \u0430\u0432\u0442\u043e\u0440\u0443 \u0441\u0442\u0430\u0442\u044c\u0438. \u0412\u043e\u043f\u0440\u043e\u0441: &#171;\u0410 \u043f\u0440\u0438\u0447\u0435\u043c \u0437\u0434\u0435\u0441\u044c, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, &#171;\u0446\u0432\u0435\u0442&#187; \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0441 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u044f?&#187;.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0435\u0449\u0430\u043d\u043d\u044b\u0439 \u0441\u044e\u0436\u0435\u0442\u043d\u044b\u0439 \u0442\u0432\u0438\u0441\u0442.<\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0411\u043e\u0431 \u041d\u0438\u0441\u0442\u0440\u043e\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043c\u044b\u0441\u043b\u0438\u0442\u044c \u0432 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 &#171;\u043a\u0440\u0430\u0441\u043d\u044b\u0445&#187; (\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445) \u0438 &#171;\u0441\u0438\u043d\u0438\u0445&#187; (\u043e\u0431\u044b\u0447\u043d\u044b\u0445) \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041d\u043e, \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0432 \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u0432\u0443\u0445 \u0446\u0432\u0435\u0442\u043e\u0432\u00a0<strong>\u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442<\/strong>. \u0412 \u043d\u0430\u0448\u0435\u043c \u043a\u0435\u0439\u0441\u0435, \u0438\u0437\u0431\u0430\u0432\u0438\u0432\u0448\u0438\u0441\u044c \u043e\u0442 \u043a\u0440\u0430\u0441\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043c\u044b \u0431\u044b \u043b\u0438\u0448\u044c \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 &#171;\u0437\u0430\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438&#187; \u0446\u0432\u0435\u0442\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430\u0448\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0432 Java \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u00a0<code>synchronized<\/code>-\u0431\u043b\u043e\u043a\u0438. \u041e\u043d\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0442 \u0441 \u043a\u0440\u0430\u0441\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438.\u00a0<code>suspend<\/code>-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u0445 \u043c\u043e\u0433\u0443\u0442:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u0410 synchronized-\u0431\u043b\u043e\u043a\u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u044b \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0445 \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u043b, \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041c\u043e\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435: \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u043a\u0440\u0430\u0441\u0438\u043c \u0438\u0445 \u0432 \u0437\u0435\u043b\u0435\u043d\u044b\u0439.<\/strong><\/p>\n<p>\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438, \u0435\u0441\u043b\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u0446\u0432\u0435\u0442? \u041a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u041d\u0415 \u043c\u043e\u0436\u0435\u0442 \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a. \u0414\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0442\u043e\u043a. \u0418\u043b\u0438 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b: \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f, \u043d\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u041d\u0415 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u0441\u044f. \u0421\u0443\u043c\u043c\u0430 \u044d\u0442\u0438\u0445 \u0444\u0430\u043a\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0446\u0435\u043b\u043e\u043c\u0443 \u043a\u0430\u0441\u043a\u0430\u0434\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0432\u0435\u0441\u0442\u0438 \u0442.\u043d. &#171;\u043f\u0440\u0435\u0437\u0443\u043c\u043f\u0446\u0438\u044e \u0432\u0438\u043d\u043e\u0432\u043d\u043e\u0441\u0442\u0438&#187;. \u041b\u044e\u0431\u043e\u0439 \u043a\u043e\u0434 \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\\\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0434\u0440\u0443\u0433\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u044b\u0442\u044c \u043e\u043a\u0440\u0430\u0448\u0435\u043d \u0432\u00a0<strong>\u0437\u0435\u043b\u0435\u043d\u044b\u0439<\/strong>. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c: &#171;\u0410 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e \u043b\u0438 \u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0443\u044e (\u0437\u0435\u043b\u0435\u043d\u0443\u044e) \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438?&#187;.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u044d\u0442\u0430 \u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u043b\u0430 \u0431\u044b \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d (\u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043a\u0440\u0430\u0441\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439) \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u043d\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b (\u0432\u0435\u0434\u044c \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c &#171;\u0437\u0435\u043b\u0435\u043d\u044b\u0435&#187; \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 &#171;\u043a\u0440\u0430\u0441\u043d\u044b\u0445&#187;, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b?). \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u044b \u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u00a0<em>\u0442\u0440\u0438\u0433\u0433\u0435\u0440<\/em>\u00a0(\u043d\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0443!) \u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0431\u044b \u043b\u0438\u0448\u043d\u044e\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 CodeCache \u0438\u00a0<code>ThreadPool<\/code>, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0435\u0440. \u0418\u00a0<strong>\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c<\/strong>, \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0431\u044b \u043d\u0435 \u0443\u0437\u043d\u0430\u043b\u0438 \u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0430\u0433\u0430 \u0432 OpenJDK, \u0432\u0435\u0434\u044c \u043f\u0440\u0435\u0434\u043f\u043e\u0441\u044b\u043b\u043e\u043a \u0435\u0433\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0441\u0442\u0430\u043b\u043e \u0431\u044b \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0435. \u041a\u0430\u043a \u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043d\u0430\u0448 \u043a\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u043c\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0443 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95a\/f8c\/e88\/95af8ce88996bce99887ed8139355590.png\" width=\"2241\" height=\"446\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/95a\/f8c\/e88\/95af8ce88996bce99887ed8139355590.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95a\/f8c\/e88\/95af8ce88996bce99887ed8139355590.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0410 \u0434\u043b\u044f \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c (\u0438\u043c\u0435\u044f \u0432 \u0432\u0438\u0434\u0443 stackless \u0438 stackfull \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438) \u044d\u0442\u0430 \u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/ydb\/articles\/786550\/\">https:\/\/habr.com\/ru\/companies\/ydb\/articles\/786550\/<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/spring_aio\/articles\/838912\/\">https:\/\/habr.com\/ru\/companies\/spring_aio\/articles\/838912\/<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/funcorp\/articles\/528778\/\">https:\/\/habr.com\/ru\/companies\/funcorp\/articles\/528778\/<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u044d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0438 \u043e \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0438 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043e \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0438\u0445 \u0440\u0435\u0448\u0438\u0442\u044c \u0438\u043b\u0438\u00a0<em>\u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c<\/em>.<\/p>\n<h3>\u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435<\/h3>\n<p>\u042f \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0443, \u0447\u0442\u043e &#171;\u043f\u0440\u0435\u0437\u0443\u043c\u043f\u0446\u0438\u044f \u0432\u0438\u043d\u043e\u0432\u043d\u043e\u0441\u0442\u0438&#187; \u0432 \u0437\u0435\u043b\u0435\u043d\u043e\u043c \u0446\u0432\u0435\u0442\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u043b\u0430 \u0431\u044b \u0438\u043c\u0435\u043d\u043d\u043e\u00a0<em>\u0442\u0440\u0438\u0433\u0433\u0435\u0440<\/em>, \u0430 \u043d\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0443\u00a0<code>IllegalMonitorStateException<\/code>. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0435\u0435, \u043c\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043d\u0438\u0437\u0438\u043c\u00a0<strong>\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c<\/strong>\u00a0\u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435 Kafka. \u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u043b\u043e\u0432\u043e \u00ab\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u00bb?<\/p>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u041f\u0420\u042f\u041c\u041e \u0412 \u0418\u0421\u0425\u041e\u0414\u041d\u041e\u041c \u041a\u041e\u0414\u0415 JDK\u00a0<a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/master\/test\/hotspot\/jtreg\/compiler\/locks\/TestNestedLocksElimination.java\">\u0415\u0421\u0422\u042c \u0422\u0415\u0421\u0422<\/a>, \u0413\u0414\u0415 \u041f\u0420\u041e\u0412\u0415\u0420\u042f\u0415\u0422\u0421\u042f \u041d\u0415\u041a\u041e\u0420\u0420\u0415\u041a\u0422\u041d\u041e\u0415 \u041f\u041e\u0412\u0415\u0414\u0415\u041d\u0418\u0415 \u041c\u041e\u041d\u0418\u0422\u041e\u0420\u0410 \u041f\u0420\u0418 \u0410\u0413\u0420\u0415\u0421\u0421\u0418\u0412\u041d\u042b\u0425 \u041e\u041f\u0422\u0418\u041c\u0418\u0417\u0410\u0426\u0418\u042f\u0425, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445\u00a0<code>synchronized<\/code>\u00a0\u0431\u043b\u043e\u043a\u0430\u0445: &#171;Nested locks optimization may create unbalanced\u00a0<code>monitor enter<\/code>\/\u00a0<code>exit<\/code>\u00a0code&#187;. \u0422\u0435\u0441\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u044b\u00a0<code>monitorenter<\/code>\/<code>monitorexit<\/code>\u00a0\u0432 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a Deadlock&#8217;\u0430\u043c \u0438&#8230;\u00a0<code>IllegalMonitorStateException<\/code>!<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434<\/h3>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0442\u044b, \u043c\u043e\u0439 \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u043d\u0430\u0448\u0435\u043b \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438, \u0438 \u044f \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0442\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u0448\u044c \u0432\u044b\u0432\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0442\u0435\u0431\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043a\u043e\u0434 \ud83d\ude42<\/p>\n<p>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a:<\/p>\n<ul>\n<li>\n<p>\u0421\u043b\u0435\u0434\u0438 \u0437\u0430 \u0441\u0432\u043e\u0438\u043c CodeCache<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c (\u043f\u043e\u043c\u043d\u0438 \u043f\u0440\u043e &#171;\u0437\u0435\u043b\u0435\u043d\u044b\u0439&#187; \u0446\u0432\u0435\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u043a\u0430\u0436\u0435\u0448\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435)<\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u0440\u0435\u0433\u0438 \u0441\u0435\u0431\u044f \u0438 \u0441\u0432\u043e\u0438\u0445 \u0431\u043b\u0438\u0437\u043a\u0438\u0445!<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1064528\/\">https:\/\/habr.com\/ru\/articles\/1064528\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0415\u0432\u0433\u0435\u043d\u0438\u0439, \u044f &#8212; Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0438 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u043e\u0431\u043e\u0439, \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0431\u0435\u0441\u0441\u043e\u043d\u043d\u044b\u0435 \u043d\u043e\u0447\u0438 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0438\u0441\u0442\u0438\u043d\u044b, \u0430 SRE-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d Post Mortem. \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f, \u0432\u0435\u0434\u044c \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0431\u0430\u0433\u0430\u0445 JDK, \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 JVM \u0438 JIT, \u043e \u043a\u043e\u0432\u0430\u0440\u0441\u0442\u0432\u0435 API \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439, \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u043f\u043e\u0434\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u044b.\u0412\u0430\u0436\u043d\u043e\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:OpenJDK 17Spring Kafka 2.8.11.\u041d\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u044d\u0442\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u0442.\u043a \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u0432 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0431\u0430\u0433\u0430 \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u043e\u043c ( \u0445\u043e\u0442\u044f \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u043a\u0430\u043a \u0448\u043f\u0438\u043e\u043d\u0441\u043a\u0438\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0432), \u0430 \u0432 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043d\u043e\u0432\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u0445 \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u043c\u044b\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0438 \u0442\u0440\u0430\u0431\u043b\u0448\u0443\u0442\u0438\u043d\u0433\u0435.\u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u044e \u0441\u043a\u0435\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0442\u0435\u0437\u0438\u0441\u0430\u043c \u0430\u0432\u0442\u043e\u0440\u0430. \u0415\u0433\u043e \u043c\u043d\u0435\u043d\u0438\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0439 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438. \u0412\u0441\u0435 \u0432\u043e\u0437\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 :)\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u041d\u0430\u0447\u0430\u0442\u044c \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0435 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0430 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439, \u0430 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0442\u0432\u0438\u0441\u0442 \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u043e\u043d\u0446\u0443 \u043c\u043e\u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430.\u041d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0441 2015 \u0433\u043e\u0434\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0436\u0435, \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0432\u0448\u0430\u044f \u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u043e\u0439, \u0441\u0442\u0430\u0442\u044c\u044f \u0411\u043e\u0431\u0430 \u041d\u0438\u0441\u0442\u0440\u043e\u043c\u0430 &#171;\u041a\u0430\u043a\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0432\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f?&#187; (Bob Nystrom &#171;What Color Is Your Function?&#187;). \u042f \u043d\u0435 \u0441\u0442\u0430\u0432\u043b\u044e \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u0442\u0435\u043c\u0435:https:\/\/habr.com\/ru\/articles\/466337\/https:\/\/habr.com\/ru\/companies\/vk\/articles\/691828\/\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u044b \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b. \u0421\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0443 \u0431\u043e\u043b\u044c\u043d\u043e (\u0438\u043b\u0438 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u043e \u043a\u043e\u0434\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a \u043e \u0435\u0434\u0438\u043d\u0438\u0446\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438):\u041a\u0430\u0436\u0434\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0446\u0432\u0435\u0442\u0426\u0432\u0435\u0442 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212;\u00a0\u043a\u0440\u0430\u0441\u043d\u044b\u0435\u041a\u0440\u0430\u0441\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u043e\u043b\u044c\u043d\u0435\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0422\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0430\u0441\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043a\u0440\u0430\u0441\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#187; \u0437\u0430\u0440\u0430\u0437\u043d\u044b\u0435&#187;. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0441\u00a0suspend fun\u00a0\u0432 Kotlin \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442 \u0432\u0435\u0441\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0435\u0435 \u043a\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u00a0suspend\u00a0\u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u0443\u043f\u0440\u0435\u043c\u0441\u044f \u0432\u00a0runBlocking\u00a0\u0431\u043b\u043e\u043a.\u041d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0442\u0435\u043c\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u0444\u0430\u043a\u0442. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0435 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d &#8212; stackful coroutines (fiber, green thread, virtual thread, user-mode thread, goroutine) \u0438 stackless coroutines (state machine, coroutine).\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e stackful coroutine \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435. \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 user space, \u0431\u0435\u0437 \u0443\u0447\u0430\u0441\u0442\u0438\u044f \u044f\u0434\u0440\u0430 \u041e\u0421, \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e, \u0442.\u0435. \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u043a\u043e\u0434\u043e\u043c, \u0430 \u043d\u0435 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u043c \u044f\u0434\u0440\u0430.\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e stackless coroutines \u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043b\u043e async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 live-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u0443\u044e suspend \u0442\u043e\u0447\u043a\u0443 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 (state machine). \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438.\u0422\u0430\u043a \u0432\u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 &#171;\u0446\u0432\u0435\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439&#187; \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u044f\u0437\u044b\u043a\u0430\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434 stackless coroutines.\u0414\u043b\u044f \u0447\u0435\u0433\u043e \u044f \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b \u044d\u0442\u043e \u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u043e\u0435 \u0447\u0442\u0438\u0432\u043e? \u0414\u0430\u0432\u0430\u0439\u0442\u0435\u00a0\u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u0434 \u0438\u043c\u0435\u0435\u0442 &#171;\u0446\u0432\u0435\u0442&#187;. \u0418 \u0438\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0430 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u0447\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0438 \u0434\u043b\u044f stackless, \u0438 \u0434\u043b\u044f stackful \u043f\u043e\u0434\u0445\u043e\u0434\u0430.\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435 \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438). \u041e\u043d \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u0432 Spring Kafka Template \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438:    private fun sendEventToKafka(    message: Message&lt;V&gt;,    mdcContextMap: Map&lt;String, String&gt;?,) {    kafkaTemplate.send(message).apply {        processCallback(mdcContextMap)    }}private fun ListenableFuture&lt;SendResult&lt;K, V&gt;&gt;.processCallback(    mdcContextMap: Map&lt;String, String&gt;?,) {    addCallback({        if (mdcContextMap != null) MDC.setContextMap(mdcContextMap)        logger.info { &#171;Message $eventName successfully sent to kafka&#187; }    }, {        if (mdcContextMap != null) MDC.setContextMap(mdcContextMap)        logger.error(it) { &#171;Failed to send $eventName to kafka: ${it.message}&#187; }    })}\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u0441\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u041d\u0430 error \u0432\u0435\u0442\u043a\u0435 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0430 \u043b\u043e\u0432\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u043f\u0438\u0448\u0435\u043c ERROR \u043b\u043e\u0433. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439, \u0442.\u043a. \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u0435\u043d. \u042f \u0432\u0438\u0434\u0435\u043b \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u044f \u043d\u0435 \u043f\u0440\u0430\u0432, \u043f\u0440\u043e\u0448\u0443 \u0442\u0435\u0431\u044f, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0432\u043e\u0437\u0440\u0430\u0437\u0438\u0442\u044c \u043c\u043d\u0435).\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430\u0441 \u0436\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u044e\u0436\u0435\u0442\u043d\u044b\u0439 \u0442\u0432\u0438\u0441\u0442. \u0412 \u0442\u0430\u043a\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438\u00a0\u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u0418 \u044d\u0442\u043e, \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u0432\u0438\u043d\u0430 API Spring Kafka. \u0427\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0447\u0435\u043c\u0443. \u041d\u0430\u043f\u043e\u043c\u043d\u044e \u043e\u0434\u043d\u0443 \u0432\u0430\u0436\u043d\u0443\u044e \u0434\u0435\u0442\u0430\u043b\u044c:\u00a0kafkaTemplate.send(message)\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0CompletableFuture\/ListenableFuture, \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043e \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u043c\u0435\u0442\u043e\u0434\u0430.\u0412 \u0447\u0435\u043c \u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430? \u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u0430\u0444\u043a\u0430-\u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435\u00a0IllegalMonitorStateException: current thread is not owner. \u041f\u0440\u0438\u0447\u0435\u043c \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0439\u043c\u0430\u0435\u043c \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443 \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043a\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440. \u0415\u0449\u0435 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u043e\u0434 \u0432\u044b\u0448\u0435 \u0438 \u0437\u0430\u0434\u0430\u0439\u0442\u0435 \u0441\u0435\u0431\u0435 \u0432\u043e\u043f\u0440\u043e\u0441: &#171;\u0427\u0442\u043e \u0436\u0435 \u0432 \u043d\u0435\u043c \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e?&#187;.\u041f\u043e\u0438\u0441\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\u041f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u0443\u0431\u0435\u0436\u0430\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043b\u043e\u0433\u0438 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u043e\u0432 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0443\u044e \u0434\u0435\u0442\u0430\u043b\u044c. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441 \u043e\u0448\u0438\u0431\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b:at PlannerUseCase$makeDecisionsByTasksAsync$1.invokeSuspend(PlannerUseCase.kt:130) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\u0410 \u044d\u0442\u043e \u0432\u0441\u0435 \u043c\u0435\u043d\u044f\u0435\u0442. \u0412\u0435\u0434\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u0440\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0435 \u0442\u0443\u0434\u0430 (\u0447\u0442\u043e, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439).\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443. \u041a\u0430\u043a\u0438\u0435 \u0442\u0435\u0437\u0438\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c:\u041c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c KafkaTemplate \u0432 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0435\u0422\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0432\u044b\u0437\u043e\u0432API \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439. \u0412\u0441\u043f\u043e\u043c\u043d\u0442\u0435, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0kafkaTemplate.send(message)\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0435\u0440 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f &#8212;\u00a0Dispatchers.IO.    private suspend fun sendEventToKafka(    message: Message&lt;V&gt;,    mdcContextMap: Map&lt;String, String&gt;?) {    withContext(Dispatchers.IO + MDCContext()) {        kafkaTemplate.send(message).apply {            processCallback(mdcContextMap = mdcContextMap)        }    }}\u041d\u043e, \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u044d\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0418\u043d\u0430\u0447\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u0432\u043e\u0434\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0435\u043b\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e :)\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438\u00a0Dispatchers.IO\u00a0\u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f\u00a0\u0441\u0442\u0440\u043e\u0433\u043e \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0442\u0440\u0435\u0434\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u0435\u0440\u044f\u0442\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440. \u0411\u043b\u0430\u0433\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0435\u0440 \u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f.    private suspend fun sendEventToKafka(    message: Message&lt;V&gt;,    mdcContextMap: Map&lt;String, String&gt;?) {    withContext(Dispatchers.Unconfined + MDCContext()) {        kafkaTemplate.send(message).apply {            processCallback(mdcContextMap = mdcContextMap)        }    }}\u0427\u0442\u043e\u0436,\u00a0Dispatchers.Unconfined\u00a0\u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u043e\u043c\u043e\u0433. \u0418 \u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u043b\u0438, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c,\u00a0\u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0435\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c (\u0435\u0441\u043b\u0438 \u0442\u044b, \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u043d\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d &#8212; \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u044e \u0442\u0435\u0431\u044f \u043a \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044e). \u0417\u043d\u0430\u0447\u0438\u0442, \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0430\u0441 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0433\u043b\u0443\u0431\u0436\u0435 \u0438\u043b\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435.\u041a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 API Spring Kafka\u041d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0430\u0441 \u0443\u0442\u043e\u043c\u043b\u044f\u0442\u044c \u0431\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u043a\u043e\u0434\u0443 Spring Kafka, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443.\/\/ org.apache.kafka.clients.producer.KafkaProducerprivate ClusterAndWaitTime waitOnMetadata(String topic, Integer partition, long nowMs,    long maxWaitMs) throws InterruptedException {  \/\/&#8230;  try {    metadata.awaitUpdate(version, remainingWaitMs);  } catch (TimeoutException ex) {    \/\/ Rethrow with original maxWaitMs to prevent logging exception with remainingWaitMs    throw new TimeoutException(        String.format(&#171;Topic %s not present in metadata after %d ms.&#187;,            topic, maxWaitMs));  }  \/\/&#8230;  return new ClusterAndWaitTime(cluster, elapsed);}\u0423\u0436\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 Spring, \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435 Kafka Producer, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u00a0waitOnMetadata(&#8230;)\u00a0\u0438 \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u00a0awaitUpdate()\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u0443\u00a0Metadata. \u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b \u0430\u043d\u0430\u043b\u0438\u0437 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0441\u044e\u0434\u0430, \u0442.\u043a. \u043a\u043e\u0433\u0434\u0430 \u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0441\u043b\u043e\u0432\u043e\u00a0wait\u00a0\u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u0435\u043d\u044f \u043d\u0430\u0441\u0442\u043e\u0440\u043e\u0436\u0438\u043b\u043e. \u041f\u043e\u0447\u0435\u043c\u0443? \u042f \u0432\u0430\u043c \u043d\u0430\u043f\u043e\u043c\u043d\u044e &#8212; API Spring Kafka \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439, \u0432\u0435\u0434\u044c \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0CompletableFuture\/ListenableFuture.\u041a\u043e\u0434\u00a0ProducerMetadata\u00a0(\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00a0Metadata):\/\/ org.apache.kafka.clients.producer.internals.ProducerMetadatapublic synchronized void awaitUpdate(final int lastVersion, final long timeoutMs)    throws InterruptedException {  long currentTimeMs = time.milliseconds();  long deadlineMs = currentTimeMs + timeoutMs &lt; 0 ? Long.MAX_VALUE : currentTimeMs + timeoutMs;  time.waitObject(this, () -&gt; {    \/\/ Throw fatal exceptions, if there are any. Recoverable topic errors will be handled by the caller.    maybeThrowFatalException();    return updateVersion() &gt; lastVersion || isClosed();  }, deadlineMs);  if (isClosed())    throw new KafkaException(&#171;Requested metadata update after close&#187;);}\u0422\u0443\u0442 \u0432\u0441\u0451 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c. \u041c\u044b \u0432\u0438\u0434\u0438\u043c\u00a0synchronized-\u0431\u043b\u043e\u043a. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c JavaDoc, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u00a0waitOnMetadata(&#8230;)\u00a0\u0432 \u043a\u043b\u0430\u0441\u0441\u0435\u00a0KafkaProducer\u00a0\u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0431\u0440\u043e\u043a\u0435\u0440\u0430\u0445 Kafka. \u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0438, \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. \u041a\u0430\u043a \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c:\u041e\u0448\u0438\u0431\u043a\u0438 \u0441\u0435\u0442\u0438\u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0437\u043d\u0430\u0447\u0438\u0442?\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, API Spring Kafka \u043d\u0430\u0441 \u043e\u0431\u043c\u0430\u043d\u044b\u0432\u0430\u0435\u0442 \u0438\u043b\u0438, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c,\u00a0\u043d\u0435\u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0435\u0442:\u041d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u044f\u0432\u043d\u043e \u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445\u0427\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a \u044f \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435 &#8212; \u043d\u0430\u0448\u0438 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442    private fun sendEventToKafka(    message: Message&lt;V&gt;,    mdcContextMap: Map&lt;String, String&gt;?,) {    kafkaTemplate.send(message).apply {        processCallback(mdcContextMap)    }}private fun ListenableFuture&lt;SendResult&lt;K, V&gt;&gt;.processCallback(    mdcContextMap: Map&lt;String, String&gt;?,) {    addCallback({        if (mdcContextMap != null)&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-489049","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/489049","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=489049"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/489049\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=489049"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=489049"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=489049"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}