{"id":336837,"date":"2022-08-10T09:00:14","date_gmt":"2022-08-10T09:00:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=336837"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=336837","title":{"rendered":"<span>\u0425\u043e\u043b\u043e\u0441\u0442\u044b\u0435 \u0446\u0438\u043a\u043b\u044b \u0432 Java<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u043e\u043b\u043e\u0441\u0442\u044b\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 (\u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f) \u0432 Java. \u042d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0447\u0430\u0441\u0442\u043e: \u0437\u0430 \u0434\u0435\u0432\u044f\u0442\u044c \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043b\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043d\u0435\u0439 \u043b\u0438\u0448\u044c \u043f\u0430\u0440\u0443 \u0440\u0430\u0437. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0442\u0435\u043c\u0430 \u0432\u0438\u0434\u0438\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438 \u043f\u043e \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c! \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <a href=\"https:\/\/github.com\/stsypanov\/sleep\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u041d\u0430 \u043c\u043e\u0439 \u0432\u043a\u0443\u0441 \u0440\u0443\u0441\u0441\u043a\u043e\u0435 &#171;\u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0439 \u0446\u0438\u043a\u043b&#187; (\u0438\u043b\u0438 &#171;\u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435&#187;) \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435 \u0438 \u0442\u043e\u0447\u043d\u0435\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0441\u0443\u0442\u044c \u044f\u0432\u043b\u0435\u043d\u0438\u044f, \u0447\u0435\u043c \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Busy_waiting\" rel=\"noopener noreferrer nofollow\">&#171;busy waiting&#187;<\/a> \u0438\u043b\u0438 &#171;busy loop&#187; \u2014 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0432 \u0445\u043e\u043b\u043e\u0441\u0442\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0432 \u0441\u043c\u044b\u0441\u043b\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f &#171;spinning&#187; \u0438\u043b\u0438 &#171;spin loop&#187; \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043b\u0443\u0447\u0448\u0435, \u043f\u0440\u0430\u0432\u0434\u0430, \u0438 \u043e\u043d\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u044b\u0442\u044b.<\/p>\n<p>\u0421\u043c\u044b\u0441\u043b \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0434\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 (\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 <code>synchronized<\/code> \u0438\u0434\u0438 <code>*Lock<\/code>-\u0430\u0445) \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>Thread.State.BLOCKED<\/code>, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0430\u0440\u0435\u0437\u0430\u0435\u0442 \u043a\u0440\u0443\u0433\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e \u0441\u0430\u043c\u043e\u043b\u0451\u0442\u0443, \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0435\u043c\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0441\u0430\u0434\u043a\u0443.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0441 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u0449\u0438\u043d\u044b, \u043a\u043e\u0440\u0443\u0442\u0438\u043d, \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 <code>CompletableFuture<\/code> <strong>\u043e\u0431\u043b\u0430\u0441\u0442\u044c \u044f\u0432\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0441\u0443\u0436\u0430\u0435\u0442\u0441\u044f<\/strong> (\u0434\u0430\u0436\u0435 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u043f\u0440\u0430\u0432\u043e\u0441\u043b\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/awaitility\/awaitility\" rel=\"noopener noreferrer nofollow\">awaitility<\/a>), \u043d\u043e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0422\u0430\u043a \u0432 JDK (\u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u0442\u0435\u0441\u0442\u043e\u0432) \u043c\u0435\u0442\u043e\u0434 <code>Thread.onSpinWait()<\/code> (\u0435\u0433\u043e \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 <code>ForkJoinPool<\/code>, <code>Phaser<\/code>, <code>StampedLock<\/code>, <code>AbstractQueued*Synchronizer<\/code>, \u0442. \u0435. \u0432 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u0445 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u041e\u0431 \u044d\u0442\u043e\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043d\u0438\u0436\u0435.<\/p>\n<h3>\u0410\u0437\u044b<\/h3>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u0447\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &#171;\u0432 \u043b\u043e\u0431&#187;):<\/p>\n<pre><code class=\"java\">volatile boolean wait = true; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430  while (wait) { }<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043c\u044b \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0441\u043b\u044b\u0448\u0438\u043c \u043d\u0435\u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0433\u0443\u043b \u043a\u0440\u044b\u043b\u044c\u0447\u0430\u0442\u043a\u0438 \u043e\u0445\u043b\u0430\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430: \u0442\u0430\u043a\u043e\u0439 \u0446\u0438\u043a\u043b \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0436\u0438\u0440\u0430\u0442\u044c \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a \u043d\u0435 \u0432 \u0441\u0435\u0431\u044f.<\/p>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u044d\u0442\u043e \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u0430\u044f \u0432 \u0441\u0438\u043b\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u0447\u0442\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">long delay = 1L;  volatile boolean wait = true;  while (wait) {   Thread.sleep(delay); }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u044b \u0445\u043e\u0442\u044c \u043f\u0430\u0440\u0443 \u0440\u0430\u0437 \u0432\u0438\u0434\u0435\u043b\u0438 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0445\u043e\u0436\u0435\u0435. \u0423 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0438\u0437\u044a\u044f\u043d\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0443\u043f\u0440\u0430\u0436\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u0437\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>1) \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442, \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public static native void sleep(long millis) throws InterruptedException;<\/code><\/pre>\n<p>\u0412\u0435\u0440\u043d\u043e, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>millis<\/code> \u0438 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c &#171;\u0443\u0441\u044b\u043f\u0438\u0442\u044c&#187; \u043f\u043e\u0442\u043e\u043a \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 1 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0443 (\u0434\u043b\u044f <a href=\"https:\/\/www.youtube.com\/watch?v=QV-ue1YMdds\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445<\/a> \u0437\u0430\u0434\u0430\u0447 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e). \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f JDK \u044d\u0442\u043e\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>2) \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0435 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public static native void sleep(long millis) throws InterruptedException;<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d <code>native<\/code>, \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043d\u0430 \u043d\u0435\u0451 \u043c\u043e\u0436\u0435\u0442 \u0432\u043b\u0438\u044f\u0442\u044c &#171;\u0436\u0435\u043b\u0435\u0437\u043e&#187;, \u043e\u0441\u044c \u0438 \u0434\u0430\u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u044f Java, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435.<\/p>\n<\/div>\n<\/details>\n<p>\u0410\u0445 \u0434\u0430, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <code>InterruptedException<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u0438\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u041f\u0440\u043e\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/p>\n<pre><code class=\"java\">@BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) public class ThreadSleepPlainBenchmark {    @Benchmark   public void sleep() throws Exception {     Thread.sleep(1);   }    @Benchmark   public void sleepNanos() throws Exception {     Thread.sleep(0, 1000);   } }<\/code><\/pre>\n<p>\u0421 \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e: \u0437\u0430\u0441\u044b\u043f\u0430\u0435\u043c \u043d\u0430 1 \u043c\u0441. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u043c\u0430\u043d\u0443\u0442\u044c \u0441\u0443\u0434\u044c\u0431\u0443 \u0438 \u0437\u0430\u0441\u043d\u0443\u0442\u044c \u043b\u0438\u0448\u044c \u043d\u0430 1000 \u043d\u0441.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>Java 11 Linux  Benchmark                             Mode  Cnt  Score   Error  Units ThreadSleepPlainBenchmark.sleep       avgt   50  1,091 \u00b1 0,005  ms\/op ThreadSleepPlainBenchmark.sleepNanos  avgt   50  1,110 \u00b1 0,005  ms\/op  Java 11 MacOS  Benchmark                             Mode  Cnt  Score   Error  Units ThreadSleepPlainBenchmark.sleep       avgt   50  1,312 \u00b1 0,042  ms\/op ThreadSleepPlainBenchmark.sleepNanos  avgt   50  1,325 \u00b1 0,029  ms\/op  Java 17 Linux  Benchmark                             Mode  Cnt  Score   Error  Units ThreadSleepPlainBenchmark.sleep       avgt   40  1,112 \u00b1 0,003  ms\/op ThreadSleepPlainBenchmark.sleepNanos  avgt   40  1,117 \u00b1 0,001  ms\/op  Java 17 MacOS  Benchmark                             Mode  Cnt  Score   Error  Units ThreadSleepPlainBenchmark.sleep       avgt   40  1,363 \u00b1 0,008  ms\/op ThreadSleepPlainBenchmark.sleepNanos  avgt   40  1,364 \u00b1 0,010  ms\/op<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"java\">@BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class ThreadSleepPlainBenchmark {    @Benchmark   public void sleepZero() throws Exception {     Thread.sleep(0);   } }<\/code><\/pre>\n<p>\u0412\u044b\u0445\u043e\u0434\u0438\u0442:<\/p>\n<pre><code>Java 11 Linux  Benchmark                              Mode  Cnt    Score    Error   Units ThreadSleepPlainBenchmark.sleepZero    avgt   50  484,261 \u00b1  0,578   ns\/op  Java 11 MacOS  Benchmark                              Mode  Cnt    Score    Error   Units ThreadSleepPlainBenchmark.sleepZero    avgt   50  501,271 \u00b1 90,137   ns\/op  Java 17 Linux  Benchmark                              Mode  Cnt    Score    Error   Units ThreadSleepPlainBenchmark.sleepZero    avgt   50  493,227 \u00b1  4,881   ns\/op  Java 17 MacOS  Benchmark                              Mode  Cnt    Score    Error   Units ThreadSleepPlainBenchmark.sleepZero    avgt   40  371,817 \u00b1  6,669   ns\/op<\/code><\/pre>\n<p>\u041d\u0435 \u0442\u043e\u0440\u043e\u043f\u0438\u0442\u0435\u0441\u044c \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u043e\u043b\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0435 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0438 \u0446\u0438\u0444\u0440\u044b, \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0431\u0437\u0430\u0446\u0435\u0432 \u043c\u044b \u043a \u043d\u0438\u043c \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 &#171;\u0443\u0441\u044b\u043f\u043b\u0435\u043d\u0438\u0435&#187; \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043e\u0441\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 0,1-0,3 \u043c\u0441, \u0447\u0442\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 10-30% (!) \u043e\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u041e\u043b\u044c\u0448\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0432 \u0446\u0438\u043a\u043b\u0430\u0445.<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u044b\u043b\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441 \u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u0430 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438, \u0430 \u0442\u043e \u0438 \u0441\u043e\u0442\u043d\u044f\u043c\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434?<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0435\u0449\u0451 \u0441 Java 5 <code>LockSupport.parkNanos(long)<\/code>, \u043a\u0430\u043a \u0438 <code>Thread.sleep()<\/code> \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>Thread.State.TIMED_WAITING<\/code>. \u0415\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u043c\u0438\u043c\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u043d\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c &#171;\u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c&#187; \u043f\u043e\u0442\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>LockSupport.unpark(Thread)<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041d\u043e \u0438 \u0442\u0443\u0442 \u0432\u0441\u0451 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"java\">@State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class ParkNanosBenchmark {    @Param({\"10\", \"100\", \"1000\", \"10000\", \"1000000\"})   long delay;    @Benchmark   public void parkNanos() {     LockSupport.parkNanos(delay);   } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>Java 11 Linux  Benchmark                      (delay)  Mode  Cnt        Score      Error  Units ParkNanosBenchmark.parkNanos        10  avgt   40    57713,345 \u00b1  165,827  ns\/op ParkNanosBenchmark.parkNanos       100  avgt   40    57672,554 \u00b1  444,892  ns\/op ParkNanosBenchmark.parkNanos      1000  avgt   40    58646,654 \u00b1  120,040  ns\/op ParkNanosBenchmark.parkNanos     10000  avgt   40    68222,650 \u00b1  115,751  ns\/op ParkNanosBenchmark.parkNanos   1000000  avgt   40  1103499,893 \u00b1 7793,704  ns\/op  Java 11 MacOS  Benchmark                      (delay)  Mode  Cnt        Score       Error  Units ParkNanosBenchmark.parkNanos        10  avgt   40    11395,046 \u00b1   250,512  ns\/op ParkNanosBenchmark.parkNanos       100  avgt   40     9171,332 \u00b1  1117,377  ns\/op ParkNanosBenchmark.parkNanos      1000  avgt   40     4781,591 \u00b1    82,799  ns\/op ParkNanosBenchmark.parkNanos     10000  avgt   40    17750,419 \u00b1   256,214  ns\/op ParkNanosBenchmark.parkNanos   1000000  avgt   40  1403117,216 \u00b1 42218,338  ns\/op  Java 17 Linux  Benchmark                      (delay)  Mode  Cnt        Score       Error  Units ParkNanosBenchmark.parkNanos        10  avgt   40    57331,896 \u00b1   606,789  ns\/op ParkNanosBenchmark.parkNanos       100  avgt   40    57701,988 \u00b1   151,346  ns\/op ParkNanosBenchmark.parkNanos      1000  avgt   40    58585,929 \u00b1   119,138  ns\/op ParkNanosBenchmark.parkNanos     10000  avgt   40    67984,687 \u00b1   186,378  ns\/op ParkNanosBenchmark.parkNanos   1000000  avgt   40  1093718,818 \u00b1  7665,960  ns\/op  Java 17 MacOS  Benchmark                      (delay)  Mode  Cnt        Score       Error  Units ParkNanosBenchmark.parkNanos        10  avgt   40    11446,015 \u00b1   243,118  ns\/op ParkNanosBenchmark.parkNanos       100  avgt   40    10283,453 \u00b1   148,363  ns\/op ParkNanosBenchmark.parkNanos      1000  avgt   40     5085,643 \u00b1    31,031  ns\/op ParkNanosBenchmark.parkNanos     10000  avgt   40    17582,777 \u00b1   159,145  ns\/op ParkNanosBenchmark.parkNanos   1000000  avgt   40  1369327,409 \u00b1  9468,778  ns\/op<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430: \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u041b\u0438\u043d\u0443\u043a\u0441\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 50 \u043c\u043a\u0441. \u041e\u043d (\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a) \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0441\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f &#171;\u0437\u0430\u0441\u044b\u043f\u0430\u043d\u0438\u044f&#187; \u0432\u0441\u0435\u0433\u0434\u0430 \u043a\u0440\u0430\u0442\u043d\u043e \u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0441\u0438 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0431\u043b\u043e\u0433\u0435 <a href=\"https:\/\/hazelcast.com\/blog\/locksupport-parknanos-under-the-hood-and-the-curious-case-of-parking\/\" rel=\"noopener noreferrer nofollow\">\u0425\u0435\u0439\u0437\u0435\u043b\u043a\u0430\u0441\u0442<\/a>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>Thread.sleep(0)<\/code> \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e: \u043e\u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043a \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>Thread.State.TIMED_WAITING<\/code> \u0438 \u043d\u0435 \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0421 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u043e\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0430 MacOS \u044f \u043d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f, \u043d\u0430 <a href=\"https:\/\/stackoverflow.com\/questions\/72870049\/does-minimum-java-lang-thread-suspend-time-depend-on-os-or-cpu\" rel=\"noopener noreferrer nofollow\">\u0421\u041e<\/a> \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u043e\u043b\u043a\u043e\u043c \u043d\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b\u0438. \u041f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044e, \u0447\u0442\u043e \u0432 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u043e\u0440\u043e\u0447\u0435 1 \u043c\u043a\u0441 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044e, \u0447\u0442\u043e \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 <code>delay = 100<\/code> \u0438 <code>delay = 1000<\/code> \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0441\u044f \u0432\u043e\u0432\u0441\u0435).<\/p>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b \u0438\u0437 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <code>Thread.sleep()<\/code> \u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u044b \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435 \u043a\u043e\u0440\u043e\u0447\u0435 1,1-1,3 \u043c\u0441<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043f\u0430\u0443\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>LockSupport.parkNanos()<\/code><\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u0440\u0430\u0442\u043d\u044b \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u041e\u0421<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430 \u041b\u0438\u043d\u0443\u043a\u0441\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0442\u043e\u043d\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u044b\u043b \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438:<\/p>\n<pre><code class=\"java\">long delay = 1L;  volatile boolean wait = true; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430  while (wait) {   Thread.sleep(delay); }<\/code><\/pre>\n<p>\u0412 \u0434\u0438\u043a\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"java\">volatile boolean  wait;  long sleepTime = 1L; for (int i = 0; wait &amp;&amp; i &lt; 5; i++) {   try {     Thread.sleep(sleepTime);   } catch(InterruptedException e) {     return result;   }   \/\/ sleepTime *= 2; \/\/ \u0438\u043d\u043e\u0433\u0434\u0430 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430 }<\/code><\/pre>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0442\u0430\u043a\u0430\u044f: \u043e\u0434\u043d\u0430 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0430 \u043f\u0430\u0443\u0437\u0430 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0441 \u0440\u0430\u0441\u0447\u0451\u0442\u043e\u043c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0444\u043b\u0430\u0433 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043d\u044f\u0442 \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430, \u0447\u0442\u043e \u0441\u0431\u0435\u0440\u0435\u0436\u0451\u0442 \u0432\u0440\u0435\u043c\u044f. \u041a\u0430\u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u0430\u043c \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0430\u0437\u043e\u043c \u0434\u0430\u0451\u0442\u0441\u044f \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 \u0434\u0435\u043b\u0435: \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u0442\u043e\u043a \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u0447\u0451\u0442\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435:<\/p>\n<pre><code class=\"java\">@State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) public class ThreadSleepInCountedLoopBenchmark {   private final ExecutorService executor = Executors.newFixedThreadPool(1);   volatile boolean wait;    @Param({\"1\", \"5\", \"10\", \"50\", \"100\"})   long delay;    @Setup(Level.Invocation)   public void setUp() {     wait = true;     startThread();   }    @TearDown(Level.Trial)   public void tearDown() {     executor.shutdown();   }    @Benchmark   public int sleep() throws Exception {     for (int i = 0; wait &amp;&amp; i &lt; delay; i++) {       Thread.sleep(1);     }     return hashCode();   }    private void startThread() {     executor.submit(() -> {       try {         Thread.sleep(delay \/ 2); \/\/ \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u043c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435         wait = false;       } catch (InterruptedException e) {         Thread.currentThread().interrupt();         throw new RuntimeException(e);       }     });   } }<\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u0437\u0430\u0441\u044b\u043f\u0430\u043d\u0438\u0435\/\u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445 \u0441 \u0431\u041e\u043b\u044c\u0448\u0438\u043c\u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438 (\u0437\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043b\u044f Java 11):<\/p>\n<pre><code>Java 11 Linux  Benchmark                                (delay)  Mode  Cnt   Score   Error  Units ThreadSleepInCountedLoopBenchmark.sleep        1  avgt   40   1,135 \u00b1 0,006  ms\/op ThreadSleepInCountedLoopBenchmark.sleep        5  avgt   40   2,300 \u00b1 0,016  ms\/op ThreadSleepInCountedLoopBenchmark.sleep       10  avgt   40   5,667 \u00b1 0,035  ms\/op ThreadSleepInCountedLoopBenchmark.sleep       50  avgt   40  26,158 \u00b1 0,038  ms\/op ThreadSleepInCountedLoopBenchmark.sleep      100  avgt   40  50,754 \u00b1 0,124  ms\/op  Java 11 MacOS  Benchmark                                (delay)  Mode  Cnt   Score   Error  Units ThreadSleepInCountedLoopBenchmark.sleep        1  avgt   40   1,313 \u00b1 0,021  ms\/op ThreadSleepInCountedLoopBenchmark.sleep        5  avgt   40   2,956 \u00b1 0,021  ms\/op ThreadSleepInCountedLoopBenchmark.sleep       10  avgt   40   6,662 \u00b1 0,031  ms\/op ThreadSleepInCountedLoopBenchmark.sleep       50  avgt   40  29,373 \u00b1 0,120  ms\/op ThreadSleepInCountedLoopBenchmark.sleep      100  avgt   40  54,278 \u00b1 0,136  ms\/op<\/code><\/pre>\n<p>\u0410 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <code>LockSupport.parkNanos()<\/code>: <\/p>\n<pre><code class=\"java\">@State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) public class ParkNanosInCountedLoopBenchmark {   private final ExecutorService executor = Executors.newFixedThreadPool(1);   volatile boolean wait;    @Param({\"1\", \"5\", \"10\", \"50\", \"100\"})   long delay;    @Setup(Level.Invocation)   public void setUp() {     wait = true;     startThread();   }    @TearDown(Level.Trial)   public void tearDown() {     executor.shutdown();   }    @Benchmark   public int sleep() {     for (int i = 0; wait &amp;&amp; i &lt; delay; i++) {       LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(1));     }     return hashCode();   }    private void startThread() {     executor.submit(() -> {       try {         Thread.sleep(delay \/ 2);         wait = false;       } catch (InterruptedException e) {         Thread.currentThread().interrupt();         throw new RuntimeException(e);       }     });   } }<\/code><\/pre>\n<pre><code>Java 11 Linux  Benchmark                              (delay)  Mode  Cnt   Score   Error  Units ParkNanosInCountedLoopBenchmark.sleep        1  avgt   20   1,079 \u00b1 0,074  ms\/op ParkNanosInCountedLoopBenchmark.sleep        5  avgt   20   2,205 \u00b1 0,038  ms\/op ParkNanosInCountedLoopBenchmark.sleep       10  avgt   20   5,404 \u00b1 0,151  ms\/op ParkNanosInCountedLoopBenchmark.sleep       50  avgt   20  25,710 \u00b1 0,024  ms\/op ParkNanosInCountedLoopBenchmark.sleep      100  avgt   20  50,546 \u00b1 0,051  ms\/op  Java 11 MacOS  Benchmark                              (delay)  Mode  Cnt   Score   Error  Units ParkNanosInCountedLoopBenchmark.sleep        1  avgt   40   1,303 \u00b1 0,023  ms\/op ParkNanosInCountedLoopBenchmark.sleep        5  avgt   40   3,021 \u00b1 0,020  ms\/op ParkNanosInCountedLoopBenchmark.sleep       10  avgt   40   6,728 \u00b1 0,032  ms\/op ParkNanosInCountedLoopBenchmark.sleep       50  avgt   40  29,407 \u00b1 0,118  ms\/op ParkNanosInCountedLoopBenchmark.sleep      100  avgt   40  54,322 \u00b1 0,161  ms\/op<\/code><\/pre>\n<p>\u0426\u0438\u0444\u0440\u044b \u0432 \u0446\u0435\u043b\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0437\u0430\u043c\u0435\u0440\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 <code>LockSupport.parkNanos()<\/code> \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c\u0438. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u043f\u0430\u0443\u0437\u044b, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430, \u043d\u043e \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0448\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0441\u0438\u043b\u0443 \u0431\u041e\u043b\u044c\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0438\u0434\u043e\u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u0449\u0435\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u0443\u0437\u044b. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 100, 200 \u0438 500 \u043c\u043a\u0441:<\/p>\n<pre><code class=\"java\">@State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) public class ParkNanosInCountedLoopBenchmark {   private final ExecutorService executor = Executors.newFixedThreadPool(1);   volatile boolean wait;    @Param({\"1\", \"5\", \"10\", \"50\", \"100\"})   long delay;    @Param({\"100\", \"200\", \"500\"})   long pause;    @Setup(Level.Invocation)   public void setUp() {     wait = true;     startThread();   }    @TearDown(Level.Trial)   public void tearDown() {     executor.shutdown();   }    @Benchmark   public int sleep() {     for (int i = 0; wait &amp;&amp; i &lt; delay; i++) {       LockSupport.parkNanos(TimeUnit.MICROSECONDS.toNanos(pause));     }     return hashCode();   }    private void startThread() {     executor.submit(() -> {       try {         Thread.sleep(delay \/ 2);         wait = false;       } catch (InterruptedException e) {         Thread.currentThread().interrupt();         throw new RuntimeException(e);       }     });   } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>Java 11 Linux  Benchmark                              (delay)  (pause)  Mode  Cnt   Score   Error  Units ParkNanosInCountedLoopBenchmark.sleep        1      100  avgt   10   0,160 \u00b1 0,001  ms\/op ParkNanosInCountedLoopBenchmark.sleep        1      200  avgt   10   0,283 \u00b1 0,004  ms\/op ParkNanosInCountedLoopBenchmark.sleep        1      500  avgt   10   0,583 \u00b1 0,053  ms\/op  ParkNanosInCountedLoopBenchmark.sleep        5      100  avgt   10   0,703 \u00b1 0,003  ms\/op ParkNanosInCountedLoopBenchmark.sleep        5      200  avgt   10   1,059 \u00b1 0,012  ms\/op ParkNanosInCountedLoopBenchmark.sleep        5      500  avgt   10   2,323 \u00b1 0,214  ms\/op  ParkNanosInCountedLoopBenchmark.sleep       10      100  avgt   10   1,338 \u00b1 0,052  ms\/op ParkNanosInCountedLoopBenchmark.sleep       10      200  avgt   10   2,557 \u00b1 0,008  ms\/op ParkNanosInCountedLoopBenchmark.sleep       10      500  avgt   10   5,277 \u00b1 0,251  ms\/op  ParkNanosInCountedLoopBenchmark.sleep       50      100  avgt   10   6,455 \u00b1 0,204  ms\/op ParkNanosInCountedLoopBenchmark.sleep       50      200  avgt   10  12,569 \u00b1 0,053  ms\/op ParkNanosInCountedLoopBenchmark.sleep       50      500  avgt   10  25,496 \u00b1 0,082  ms\/op  ParkNanosInCountedLoopBenchmark.sleep      100      100  avgt   10  12,853 \u00b1 0,434  ms\/op ParkNanosInCountedLoopBenchmark.sleep      100      200  avgt   10  25,077 \u00b1 0,158  ms\/op ParkNanosInCountedLoopBenchmark.sleep      100      500  avgt   10  50,485 \u00b1 0,040  ms\/op  Java 11 MacOS  Benchmark                              (delay)  (pause)  Mode  Cnt   Score   Error  Units ParkNanosInCountedLoopBenchmark.sleep        1      100  avgt   40   0,132 \u00b1 0,001  ms\/op ParkNanosInCountedLoopBenchmark.sleep        1      200  avgt   40   0,258 \u00b1 0,001  ms\/op ParkNanosInCountedLoopBenchmark.sleep        1      500  avgt   40   0,695 \u00b1 0,010  ms\/op  ParkNanosInCountedLoopBenchmark.sleep        5      100  avgt   40   0,625 \u00b1 0,009  ms\/op ParkNanosInCountedLoopBenchmark.sleep        5      200  avgt   40   1,172 \u00b1 0,004  ms\/op ParkNanosInCountedLoopBenchmark.sleep        5      500  avgt   40   2,764 \u00b1 0,021  ms\/op  ParkNanosInCountedLoopBenchmark.sleep       10      100  avgt   40   1,262 \u00b1 0,013  ms\/op ParkNanosInCountedLoopBenchmark.sleep       10      200  avgt   40   2,442 \u00b1 0,097  ms\/op ParkNanosInCountedLoopBenchmark.sleep       10      500  avgt   40   5,927 \u00b1 0,118  ms\/op  ParkNanosInCountedLoopBenchmark.sleep       50      100  avgt   40   6,327 \u00b1 0,058  ms\/op ParkNanosInCountedLoopBenchmark.sleep       50      200  avgt   40  11,848 \u00b1 1,748  ms\/op ParkNanosInCountedLoopBenchmark.sleep       50      500  avgt   40  28,142 \u00b1 0,272  ms\/op  ParkNanosInCountedLoopBenchmark.sleep      100      100  avgt   40  12,580 \u00b1 0,187  ms\/op ParkNanosInCountedLoopBenchmark.sleep      100      200  avgt   40  24,894 \u00b1 1,016  ms\/op ParkNanosInCountedLoopBenchmark.sleep      100      500  avgt   40  53,438 \u00b1 0,137  ms\/op <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435, \u0442. \u043a. \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0433\u0440\u0430\u043d\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u043e\u0441\u043e\u0431\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 <code>pause<\/code> \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 100, 200 \u0438\u043b\u0438 500 \u043c\u043a\u0441. \u041d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0438\u0436\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0445. \u0414\u043b\u044f \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0433\u0430\u0434\u043a\u043e\u0439, \u043d\u0430 <a href=\"https:\/\/stackoverflow.com\/questions\/73292963\/infrasctructural-costs-of-thread-sleep-vs-locksupport-parknanos\" rel=\"noopener noreferrer nofollow\">\u0421\u041e<\/a> \u0442\u0430\u043a\u0436\u0435 \u0442\u0438\u0448\u0438\u043d\u0430. \u0415\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 <code>ThreadSleepVsParkNanosBenchmark<\/code>.<\/p>\n<p>\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u0440\u0430\u0441\u0447\u0451\u0442\u043d\u044b\u0445 \u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435 \u0432\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u0430. \u042d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u0447\u0442\u043e\u0431\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u0435\u043d\u044f\u0435\u043c<\/p>\n<pre><code class=\"java\">for (int i = 0; wait &amp;&amp; i &lt; delay; i++) {   LockSupport.parkNanos(TimeUnit.MICROSECONDS.toNanos(pause)); }<\/code><\/pre>\n<p>\u043d\u0430<\/p>\n<pre><code class=\"java\">while (wait) {   LockSupport.parkNanos(TimeUnit.MICROSECONDS.toNanos(pause)); }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0418 \u0442\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>Java 11 Linux  Benchmark                            (delay)  (pause)  Mode  Cnt   Score   Error  Units  ParkNanosInWhileLoopBenchmark.sleep        1      100  avgt   10   0,161 \u00b1 0,002  ms\/op ParkNanosInWhileLoopBenchmark.sleep        1      200  avgt   10   0,282 \u00b1 0,012  ms\/op ParkNanosInWhileLoopBenchmark.sleep        1      500  avgt   10   0,603 \u00b1 0,006  ms\/op  ParkNanosInWhileLoopBenchmark.sleep        5      100  avgt   10   2,219 \u00b1 0,009  ms\/op ParkNanosInWhileLoopBenchmark.sleep        5      200  avgt   10   2,251 \u00b1 0,045  ms\/op ParkNanosInWhileLoopBenchmark.sleep        5      500  avgt   10   2,403 \u00b1 0,029  ms\/op  ParkNanosInWhileLoopBenchmark.sleep       10      100  avgt   10   5,242 \u00b1 0,019  ms\/op ParkNanosInWhileLoopBenchmark.sleep       10      200  avgt   10   5,374 \u00b1 0,031  ms\/op ParkNanosInWhileLoopBenchmark.sleep       10      500  avgt   10   5,416 \u00b1 0,030  ms\/op  ParkNanosInWhileLoopBenchmark.sleep       50      100  avgt   10  25,262 \u00b1 0,068  ms\/op ParkNanosInWhileLoopBenchmark.sleep       50      200  avgt   10  25,338 \u00b1 0,034  ms\/op ParkNanosInWhileLoopBenchmark.sleep       50      500  avgt   10  25,461 \u00b1 0,067  ms\/op  ParkNanosInWhileLoopBenchmark.sleep      100      100  avgt   10  50,242 \u00b1 0,019  ms\/op ParkNanosInWhileLoopBenchmark.sleep      100      200  avgt   10  50,326 \u00b1 0,018  ms\/op ParkNanosInWhileLoopBenchmark.sleep      100      500  avgt   10  50,449 \u00b1 0,043  ms\/op  Java 11 MacOS  Benchmark                            (delay)  (pause)  Mode  Cnt   Score   Error  Units  ParkNanosInWhileLoopBenchmark.sleep        1      100  avgt   40   0,134 \u00b1 0,003  ms\/op ParkNanosInWhileLoopBenchmark.sleep        1      200  avgt   40   0,258 \u00b1 0,001  ms\/op ParkNanosInWhileLoopBenchmark.sleep        1      500  avgt   40   0,694 \u00b1 0,010  ms\/op  ParkNanosInWhileLoopBenchmark.sleep        5      100  avgt   40   2,392 \u00b1 0,015  ms\/op ParkNanosInWhileLoopBenchmark.sleep        5      200  avgt   40   2,521 \u00b1 0,012  ms\/op ParkNanosInWhileLoopBenchmark.sleep        5      500  avgt   40   2,810 \u00b1 0,011  ms\/op  ParkNanosInWhileLoopBenchmark.sleep       10      100  avgt   40   5,739 \u00b1 0,018  ms\/op ParkNanosInWhileLoopBenchmark.sleep       10      200  avgt   40   5,869 \u00b1 0,182  ms\/op ParkNanosInWhileLoopBenchmark.sleep       10      500  avgt   40   6,517 \u00b1 0,099  ms\/op  ParkNanosInWhileLoopBenchmark.sleep       50      100  avgt   40  30,580 \u00b1 0,979  ms\/op ParkNanosInWhileLoopBenchmark.sleep       50      200  avgt   40  27,898 \u00b1 0,117  ms\/op ParkNanosInWhileLoopBenchmark.sleep       50      500  avgt   40  28,105 \u00b1 0,101  ms\/op  ParkNanosInWhileLoopBenchmark.sleep      100      100  avgt   40  52,973 \u00b1 0,138  ms\/op ParkNanosInWhileLoopBenchmark.sleep      100      200  avgt   40  54,083 \u00b1 0,829  ms\/op ParkNanosInWhileLoopBenchmark.sleep      100      500  avgt   40  56,220 \u00b1 0,258  ms\/op<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0432 1, 5 \u0438 10 \u043c\u0441 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0441 50 \u0438 100 \u043c\u0441 \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a<code>Thread.sleep()<\/code>.<\/p>\n<p>\u0412\u044b\u0432\u043e\u0434\u044b \u0438\u0437 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043f\u0430\u0443\u0437 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u043d\u044c\u0448\u0435<\/p>\n<\/li>\n<li>\n<p><code>LockSupport.parkNanos()<\/code> \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a (100-200 \u043c\u043a\u0441) \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c <code>Thread.sleep()<\/code> \u0431\u044b\u043b \u0431\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435 <code>LockSupport.parkNanos()<\/code><\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>\u0412 <a href=\"https:\/\/openjdk.org\/jeps\/285\" rel=\"noopener noreferrer nofollow\">Java 9<\/a> \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>Thread.onSpinWait()<\/code>, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0433\u043b\u0430\u0441\u0438\u0442:<\/p>\n<blockquote>\n<p>Indicates that the caller is momentarily unable to progress, until the occurrence of one or more actions on the part of other activities. By invoking this method within each iteration of a spin-wait loop construct, the calling thread indicates to the runtime that it is busy-waiting. The runtime may take action to improve the performance of invoking spin-wait loop constructions.<\/p>\n<p>The code above would remain correct even if the onSpinWait method was not called at all. However on some architectures the Java Virtual Machine may issue the processor instructions to address such code patterns in a more beneficial way.<\/p>\n<\/blockquote>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u0430\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"java\">class EventHandler {   volatile boolean eventNotificationNotReceived;    void waitForEventAndHandleIt() {     while (eventNotificationNotReceived) {       Thread.onSpinWait();     }     readAndProcessEvent();   }    void readAndProcessEvent() {     \/\/ Read event from some source and process it   } }<\/code><\/pre>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u043d\u044b <code>Thread.sleep(1)<\/code> \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/p>\n<pre><code class=\"java\">@State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) public class ThreadOnSpinWaitBenchmark {   private final ExecutorService executor = Executors.newFixedThreadPool(1);   volatile boolean wait;    @Param({\"5\", \"10\", \"50\", \"100\"})   long delay;    @Setup(Level.Invocation)   public void setUp() {     wait = true;     startThread();   }    @TearDown(Level.Trial)   public void tearDown() {     executor.shutdown();   }    @Benchmark   public int onSpinWait() {     while (wait) {       Thread.onSpinWait(); \/\/ \u0442\u0443\u0442 \u0431\u044b\u043b Thread.sleep(1)     }     return hashCode();   }    private void startThread() {     executor.submit(() -> {       try {         Thread.sleep(delay \/ 2);         wait = false;       } catch (InterruptedException e) {         Thread.currentThread().interrupt();         throw new RuntimeException(e);       }     });   } }<\/code><\/pre>\n<p>\u0426\u0438\u0444\u0440\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a:<\/p>\n<pre><code>Java 11 Linux  Benchmark                             (delay)  Mode  Cnt   Score    Error  Units  ThreadOnSpinWaitBenchmark.onSpinWait        1  avgt   25   0,003 \u00b1  0,001  ms\/op ThreadOnSpinWaitBenchmark.onSpinWait        5  avgt   25   2,074 \u00b1  0,001  ms\/op ThreadOnSpinWaitBenchmark.onSpinWait       10  avgt   25   5,077 \u00b1  0,001  ms\/op ThreadOnSpinWaitBenchmark.onSpinWait       50  avgt   25  25,083 \u00b1  0,004  ms\/op ThreadOnSpinWaitBenchmark.onSpinWait      100  avgt   25  50,086 \u00b1  0,004  ms\/op  ThreadSleepBenchmark.sleep                  1  avgt   25   1,117 \u00b1  0,001  ms\/op ThreadSleepBenchmark.sleep                  5  avgt   25   2,241 \u00b1  0,005  ms\/op ThreadSleepBenchmark.sleep                 10  avgt   25   5,588 \u00b1  0,009  ms\/op ThreadSleepBenchmark.sleep                 50  avgt   25  25,721 \u00b1  0,034  ms\/op ThreadSleepBenchmark.sleep                100  avgt   25  50,537 \u00b1  0,043  ms\/op  Java 11 MacOS  Benchmark                             (delay)  Mode  Cnt   Score    Error  Units  ThreadOnSpinWaitBenchmark.onSpinWait        1  avgt   25   0,003 \u00b1  0,001  ms\/op ThreadOnSpinWaitBenchmark.onSpinWait        5  avgt   25   2,499 \u00b1  0,004  ms\/op ThreadOnSpinWaitBenchmark.onSpinWait       10  avgt   25   6,037 \u00b1  0,024  ms\/op ThreadOnSpinWaitBenchmark.onSpinWait       50  avgt   25  28,001 \u00b1  0,140  ms\/op ThreadOnSpinWaitBenchmark.onSpinWait      100  avgt   25  53,054 \u00b1  0,206  ms\/op  ThreadSleepBenchmark.sleep                  1  avgt   25   1,374 \u00b1  0,008  ms\/op ThreadSleepBenchmark.sleep                  5  avgt   25   2,902 \u00b1  0,014  ms\/op ThreadSleepBenchmark.sleep                 10  avgt   25   6,665 \u00b1  0,029  ms\/op ThreadSleepBenchmark.sleep                 50  avgt   25  28,760 \u00b1  0,153  ms\/op ThreadSleepBenchmark.sleep                100  avgt   25  53,757 \u00b1  0,229  ms\/op<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <code>Thread.onSpinWait()<\/code> \u043f\u043e \u0438\u0434\u0435\u0435 \u0434\u0430\u0451\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 (\u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u043f\u0443\u0441\u0442\u043e\u0433\u043e <code>while(true)<\/code>). \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c:<\/p>\n<pre><code class=\"java\">@State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class ThreadOnSpinWaitPlainBenchmark {   private final ExecutorService executor = Executors.newFixedThreadPool(1);   volatile boolean wait;    @Setup(Level.Invocation)   public void setUp() {     wait = true;     executor.submit(() -> {         wait = false;     });   }    @TearDown(Level.Trial)   public void tearDown() {     executor.shutdown();   }    @Benchmark   public int onSpinWait() {     while (wait) {       Thread.onSpinWait();     }     return hashCode();   } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043b\u0430\u0433 \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439:<\/p>\n<pre><code>Java 11 Linux ThreadOnSpinWaitPlainBenchmark.onSpinWait  avgt  40  2059,759 \u00b1   9,187 ns\/op  Java 17 Linux ThreadOnSpinWaitPlainBenchmark.onSpinWait  avgt  40  2018,547 \u00b1  37,834 ns\/op  Java 11 MacOS ThreadOnSpinWaitPlainBenchmark.onSpinWait  avgt  40  2478,869 \u00b1 122,442 ns\/op  Java 17 MacOS ThreadOnSpinWaitPlainBenchmark.onSpinWait  avgt  40  2315,390 \u00b1  42,885 ns\/op<\/code><\/pre>\n<p>\u041c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0432\u0441\u044e\u0434\u0443 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d? \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0435\u0442. \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f. \u0415\u0441\u043b\u0438 \u043a\u043e\u0434 \u043e\u043d \u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0438\u0434\u0443<\/p>\n<pre><code class=\"java\">\u0446\u0438\u043a\u043b-\u0441-\u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c {   Thread.sleep(delay); }<\/code><\/pre>\n<p>\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0439 \u043d\u0435\u0442 (\u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434). \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u0435\u043d, \u0442. \u043a. \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u043f\u043e\u0447\u0442\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u0444\u043b\u0430\u0433\u0430.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u0445 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0421\u0443\u0442\u044c &#171;\u043f\u0440\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f&#187; \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e  \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e <a href=\"https:\/\/stackoverflow.com\/questions\/73261540\/confusing-branches-and-l1-dcache-loads-in-the-output-of-jmhs-linuxperfnormprofi\" rel=\"noopener noreferrer nofollow\">\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u043d\u0435\u0435<\/a> \u0442\u0443\u043f\u043e\u0433\u043e <code>while(true)<\/code> \u0438 \u043e\u0442\u0437\u044b\u0432\u0447\u0438\u0432\u0435\u0435 <code>Thread.sleep(1)<\/code>. \u0415\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 (\u043e\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c <code>Thread.State.TIMED_WAITING<\/code>), \u0447\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0441\u0431\u0435\u0440\u0435\u0433\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043e\u0442 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u0441\u043d\u0443\u0432\u0448\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0434\u0440\u0435\/\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435.<\/p>\n<p>\u041d\u043e \u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043d\u044e\u0430\u043d\u0441\u044b \ud83d\ude42<\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0451\u043c, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043a\u043b\u0430\u0441\u0441 <code>java.nio.Bits<\/code> \u0438\u0437 JDK \u0438 \u043d\u0430\u0439\u0434\u0451\u043c \u0432 \u043d\u0451\u043c <code>Thread.sleep()<\/code>:<\/p>\n<pre><code class=\"java\">\/\/ A retry loop with exponential back-off delays. \/\/ Sometimes it would suffice to give up once reference \/\/ processing is complete.  But if there are many threads \/\/ competing for memory, this gives more opportunities for \/\/ any given thread to make progress.  In particular, this \/\/ seems to be enough for a stress test like \/\/ DirectBufferAllocTest to (usually) succeed, while \/\/ without it that test likely fails.  Since failure here \/\/ ends in OOME, there's no need to hurry. long sleepTime = 1; int sleeps = 0; while (true) {   if (tryReserveMemory(size, cap)) {     return;   }   if (sleeps >= MAX_SLEEPS) {     break;   }   try {     if (!jlra.waitForReferenceProcessing()) {       Thread.sleep(sleepTime);       sleepTime &lt;&lt;= 1;       sleeps++;     }   } catch (InterruptedException e) {     interrupted = true;   } }<\/code><\/pre>\n<p>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u043d\u0435\u043c\u0443 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u0439, \u0438 \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u0430\u043c\u043e\u043d\u0430\u0434\u0435\u044f\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0430\u043c <code>Thread.onSpinWait()<\/code>, \u0442\u043e <code>OOME<\/code> \u0432 \u0442\u0435\u0441\u0442\u0435 <code>DirectBufferAllocTest<\/code> \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0435\u0431\u044f \u0434\u043e\u043b\u0433\u043e \u0436\u0434\u0430\u0442\u044c:<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u0430\u0436\u043d\u043e\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0435\u0441\u0442 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441 <code>public static void main(String[] args)<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \u0412\u041c<\/p>\n<pre><code>-XX:MaxDirectMemorySize=128m -XX:-ExplicitGCInvokesConcurrent<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u043e\u0442 \u0442\u0435\u0441\u0442 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \ud83d\ude42<\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430: \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a <code>Thread.sleep()<\/code> \u0443\u0441\u044b\u043f\u0438\u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438, <code>Thread.onSpinWait()<\/code> \u043c\u043e\u043b\u043e\u0442\u0438\u0442 \u0432\u0445\u043e\u043b\u043e\u0441\u0442\u0443\u044e \u043d\u0435 \u0434\u0430\u0432\u0430\u044f \u043f\u0440\u043e\u0434\u044b\u0445\u0443 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u0430\u043c (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u043c \u043c\u0443\u0441\u043e\u0440), \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c <a href=\"https:\/\/mail.openjdk.org\/pipermail\/core-libs-dev\/2022-June\/091685.html\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u043f\u0435\u0440\u0435\u0436\u0430\u0435\u0442 \u0435\u0451 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435<\/a>. \u042d\u0442\u0430 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0441\u0442\u0435 <code>AttachWithStalePidFile<\/code>(\u044d\u0442\u043e\u0442 \u0442\u0435\u0441\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0442. \u043a. \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JDK \u0438 \u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435).<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 JDK. \u041f\u043e\u0441\u043b\u0435 \u0438\u0445 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443 (\u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e <code>~\/IdeaProjects\/jdk<\/code>) \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c<\/p>\n<pre><code> $ make test TEST=serviceability\/attach\/AttachWithStalePidFile.java<\/code><\/pre>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c<\/p>\n<pre><code>============================== Test summary ==============================    TEST                                              TOTAL  PASS  FAIL ERROR       jtreg:test\/hotspot\/jtreg\/serviceability\/attach\/AttachWithStalePidFile.java                                                          1     1     0     0    ============================== TEST SUCCESS<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u044d\u0442\u043e\u0442 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 <code>Thread.onSpinWait()<\/code>, \u0432\u0435\u0434\u044c \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"java\">private static void waitForAndResumeVM(int pid) throws Exception {   Path pauseFile = Paths.get(\"vm.paused.\" + pid);   int retries = 60;   while(!Files.exists(pauseFile) &amp;&amp; --retries > 0) {     Thread.sleep(1000);   }   if(retries == 0) {     throw new RuntimeException(\"Timeout waiting for VM to start. \" +       \"vm.paused file not created within 60 seconds.\");   }   Files.delete(pauseFile); }<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0434\u0435\u0441\u044c \u0442\u0430 \u0436\u0435: \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0435\u0433\u043e \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0438 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>Thread.onSpinWait()<\/code> \u043f\u043e\u0434\u0433\u0440\u0435\u0431\u0430\u0435\u0442 \u0432\u0441\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 \u0441\u0435\u0431\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f <code>Thread.State.RUNNABLE<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u043c \u0432 \u043e\u0434\u043d\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0438 \u0437\u043b\u043e\u043c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445.<\/p>\n<p>\u0412\u044b\u0432\u043e\u0434\u044b:<\/p>\n<ul>\n<li>\n<p>\u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u0436\u0435 \u0432 \u0445\u0440\u0435\u0441\u0442\u043e\u043c\u0430\u0442\u0438\u0439\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u0412\u0441\u0435\u0433\u0434\u0430, \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/p>\n<\/li>\n<li>\n<p><code>Thread.onSpinWait()<\/code> \u0434\u0430\u0451\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u0445\u043e\u043b\u043e\u0441\u0442\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445, \u043d\u043e \u043e\u043d \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0436\u043e\u0440\u043b\u0438\u0432. \u0425\u043e\u0440\u043e\u0448\u0435\u043d\u044c\u043a\u043e \u0432\u0437\u0432\u0435\u0441\u044c\u0442\u0435 \u0432\u0441\u0435 \u0437\u0430 \u0438 \u043f\u0440\u043e\u0442\u0438\u0432, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435, \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435<\/p>\n<\/li>\n<\/ul>\n<h3>\u0415\u0449\u0451 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b<\/h3>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435, \u0442. \u0435. <code>Thread.onSpinWait()<\/code> \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0430 \u0434\u043e\u0436\u0438\u0434\u0430\u0442\u044c\u0441\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f <code>Thread.sleep()<\/code> \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c. \u041f\u0440\u0438 \u0442\u0430\u043a\u0438\u0445 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u0430\u0445 \u043f\u0430\u043b\u043e\u0447\u043a\u043e\u0439-\u0432\u044b\u0440\u0443\u0447\u0430\u043b\u043e\u0447\u043a\u043e\u0439 <em>\u043c\u043e\u0436\u0435\u0442<\/em> \u0441\u0442\u0430\u0442\u044c <code>Thread.yield()<\/code>, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0435 \u0433\u043b\u0430\u0441\u0438\u0442:<\/p>\n<blockquote>\n<p>A hint to the scheduler that the current thread is willing to yield its current use of a processor.<\/p>\n<\/blockquote>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0442\u0443\u0442 \u0436\u0435 \u0438\u0434\u0451\u0442 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0435:<\/p>\n<blockquote>\n<p><strong><u>The scheduler is free to ignore this hint.<\/u><\/strong><br \/>Yield is a heuristic attempt to improve relative progression between threads that would otherwise over-utilise a CPU. <strong><u>Its use should be combined with detailed profiling and benchmarking to ensure that it actually has the desired effect<\/u><\/strong>.<\/p>\n<p>It is rarely appropriate to use this method. It may be useful for debugging or testing purposes, where it may help to reproduce bugs due to race conditions. It may also be useful when designing concurrency control constructs such as the ones in the <code>java.util.concurrent.locks<\/code> package.<\/p>\n<\/blockquote>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 <code>Thread.onSpinWait()<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>Thread.yield()<\/code> \u0432 <code>java.nio.Bits<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u0441\u0442\u0435 <code>DirectBufferAllocTest<\/code>, \u043d\u043e \u044d\u0442\u043e \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a \u0441 \u043c\u0435\u0441\u0442\u0430 \u0432 \u043a\u0430\u0440\u044c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434  \u0432\u043c\u0435\u0441\u0442\u043e <code>Thread.sleep()<\/code>.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>Thread.yield()<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>Thread.sleep(1000)<\/code> \u0432 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u043c \u0432\u044b\u0448\u0435 <code>AttachWithStalePidFile<\/code> \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442, \u0442\u0435\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0434\u0430\u0442\u044c.<\/p>\n<p>\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e <code>Thread.yield()<\/code> \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u0439 \u043a\u0432\u0430\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u043e \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432, \u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u043d\u0438\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b\u043c, \u0447\u0435\u043c \u0441 <code>Thread.onSpinWait()<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <code>ThreadPausingBenchmark<\/code>.<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<p>\u041a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0435\u0442:<\/p>\n<ul>\n<li>\n<p><code>Thread.sleep()<\/code> \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u043e\u043d \u043d\u0435\u0433\u0438\u0431\u043a\u0438\u0439 \u0438 \u0434\u043e\u0440\u043e\u0433\u043e\u0439<\/p>\n<\/li>\n<li>\n<p><code>LockSupport.parkNanos()<\/code> \u0433\u0438\u0431\u0447\u0435 \u0438 \u0434\u0435\u0448\u0435\u0432\u043b\u0435, \u043d\u043e \u0438 \u043e\u043d \u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u0435\u043d<\/p>\n<\/li>\n<li>\n<p><code>Thread.onSpinWait()<\/code> \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u0445 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438) \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0436\u0430\u0434\u0435\u043d<\/p>\n<\/li>\n<li>\n<p><code>Thread.yield()<\/code> \u0441\u0442\u0440\u0451\u043c\u043d\u044b\u0439 \u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0430 \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0447\u0442\u043e, \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451. \u0414\u043e \u043d\u043e\u0432\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447!<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/post\/674116\/\"> https:\/\/habr.com\/ru\/post\/674116\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u043e\u043b\u043e\u0441\u0442\u044b\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 (\u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f) \u0432 Java. \u042d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0447\u0430\u0441\u0442\u043e: \u0437\u0430 \u0434\u0435\u0432\u044f\u0442\u044c \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043b\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043d\u0435\u0439 \u043b\u0438\u0448\u044c \u043f\u0430\u0440\u0443 \u0440\u0430\u0437. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0442\u0435\u043c\u0430 \u0432\u0438\u0434\u0438\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438 \u043f\u043e \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c! \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <a href=\"https:\/\/github.com\/stsypanov\/sleep\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u041d\u0430 \u043c\u043e\u0439 \u0432\u043a\u0443\u0441 \u0440\u0443\u0441\u0441\u043a\u043e\u0435 &#171;\u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0439 \u0446\u0438\u043a\u043b&#187; (\u0438\u043b\u0438 &#171;\u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435&#187;) \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435 \u0438 \u0442\u043e\u0447\u043d\u0435\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0441\u0443\u0442\u044c \u044f\u0432\u043b\u0435\u043d\u0438\u044f, \u0447\u0435\u043c \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Busy_waiting\" rel=\"noopener noreferrer nofollow\">&#171;busy waiting&#187;<\/a> \u0438\u043b\u0438 &#171;busy loop&#187; \u2014 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0432 \u0445\u043e\u043b\u043e\u0441\u0442\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0432 \u0441\u043c\u044b\u0441\u043b\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f &#171;spinning&#187; \u0438\u043b\u0438 &#171;spin loop&#187; \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043b\u0443\u0447\u0448\u0435, \u043f\u0440\u0430\u0432\u0434\u0430, \u0438 \u043e\u043d\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u044b\u0442\u044b.<\/p>\n<p>\u0421\u043c\u044b\u0441\u043b \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0434\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 (\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 <code>synchronized<\/code> \u0438\u0434\u0438 <code>*Lock<\/code>-\u0430\u0445) \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>Thread.State.BLOCKED<\/code>, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0430\u0440\u0435\u0437\u0430\u0435\u0442 \u043a\u0440\u0443\u0433\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e \u0441\u0430\u043c\u043e\u043b\u0451\u0442\u0443, \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0435\u043c\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0441\u0430\u0434\u043a\u0443.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0441 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u0449\u0438\u043d\u044b, \u043a\u043e\u0440\u0443\u0442\u0438\u043d, \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 <code>CompletableFuture<\/code> <strong>\u043e\u0431\u043b\u0430\u0441\u0442\u044c \u044f\u0432\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0441\u0443\u0436\u0430\u0435\u0442\u0441\u044f<\/strong> (\u0434\u0430\u0436\u0435 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u043f\u0440\u0430\u0432\u043e\u0441\u043b\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/awaitility\/awaitility\" rel=\"noopener noreferrer nofollow\">awaitility<\/a>), \u043d\u043e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0422\u0430\u043a \u0432 JDK (\u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u0442\u0435\u0441\u0442\u043e\u0432) \u043c\u0435\u0442\u043e\u0434 <code>Thread.onSpinWait()<\/code> (\u0435\u0433\u043e \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 <code>ForkJoinPool<\/code>, <code>Phaser<\/code>, <code>StampedLock<\/code>, <code>AbstractQueued*Synchronizer<\/code>, \u0442. \u0435. \u0432 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u0445 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u041e\u0431 \u044d\u0442\u043e\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043d\u0438\u0436\u0435.<\/p>\n<h3>\u0410\u0437\u044b<\/h3>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u0447\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &#171;\u0432 \u043b\u043e\u0431&#187;):<\/p>\n<pre><code class=\"java\">volatile boolean wait = true; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430  while (wait) { }<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043c\u044b \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0441\u043b\u044b\u0448\u0438\u043c \u043d\u0435\u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0433\u0443\u043b \u043a\u0440\u044b\u043b\u044c\u0447\u0430\u0442\u043a\u0438 \u043e\u0445\u043b\u0430\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430: \u0442\u0430\u043a\u043e\u0439 \u0446\u0438\u043a\u043b \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0436\u0438\u0440\u0430\u0442\u044c \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a \u043d\u0435 \u0432 \u0441\u0435\u0431\u044f.<\/p>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u044d\u0442\u043e \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u0430\u044f \u0432 \u0441\u0438\u043b\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u0447\u0442\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">long delay = 1L;  volatile boolean wait = true;  while (wait) {   Thread.sleep(delay); }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u044b \u0445\u043e\u0442\u044c \u043f\u0430\u0440\u0443 \u0440\u0430\u0437 \u0432\u0438\u0434\u0435\u043b\u0438 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0445\u043e\u0436\u0435\u0435. \u0423 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0438\u0437\u044a\u044f\u043d\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0443\u043f\u0440\u0430\u0436\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u0437\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>1) \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442, \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public static native void sleep(long millis) throws InterruptedException;<\/code><\/pre>\n<p>\u0412\u0435\u0440\u043d\u043e, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>millis<\/code> \u0438 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c &#171;\u0443\u0441\u044b\u043f\u0438\u0442\u044c&#187; \u043f\u043e\u0442\u043e\u043a \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 1 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0443 (\u0434\u043b\u044f <a href=\"https:\/\/www.youtube.com\/watch?v=QV-ue1YMdds\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445<\/a> \u0437\u0430\u0434\u0430\u0447 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e). \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f JDK \u044d\u0442\u043e\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>2) \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0435 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public static native void sleep(long millis) throws InterruptedException;<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d <code>native<\/code>, \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043d\u0430 \u043d\u0435\u0451 \u043c\u043e\u0436\u0435\u0442 \u0432\u043b\u0438\u044f\u0442\u044c &#171;\u0436\u0435\u043b\u0435\u0437\u043e&#187;, \u043e\u0441\u044c \u0438 \u0434\u0430\u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u044f Java, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435.<\/p>\n<\/div>\n<\/details>\n<p>\u0410\u0445 \u0434\u0430, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <code>InterruptedException<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u0438\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u041f\u0440\u043e\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/p>\n<pre><code class=\"java\">@BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) public class ThreadSleepPlainBenchmark {    @Benchmark   public void sleep() throws Exception {     Thread.sleep(1);   }    @Benchmark   public void sleepNanos() throws Exception {     Thread.sleep(0, 1000);   } }<\/code><\/pre>\n<p>\u0421 \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e: \u0437\u0430\u0441\u044b\u043f\u0430\u0435\u043c \u043d\u0430 1 \u043c\u0441. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u043c\u0430\u043d\u0443\u0442\u044c \u0441\u0443\u0434\u044c\u0431\u0443 \u0438 \u0437\u0430\u0441\u043d\u0443\u0442\u044c \u043b\u0438\u0448\u044c \u043d\u0430 1000 \u043d\u0441.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>Java 11 Linux  Benchmark                             Mode  Cnt  Score   Error  Units ThreadSleepPlainBenchmark.sleep       avgt   50  1,091 \u00b1 0,005  ms\/op ThreadSleepPlainBenchmark.sleepNanos  avgt   50  1,110 \u00b1 0,005  ms\/op  Java 11 MacOS  Benchmark                             Mode  Cnt  Score   Error  Units ThreadSleepPlainBenchmark.sleep       avgt   50  1,312 \u00b1 0,042  ms\/op ThreadSleepPlainBenchmark.sleepNanos  avgt   50  1,325 \u00b1 0,029  ms\/op  Java 17 Linux  Benchmark                             Mode  Cnt  Score   Error  Units ThreadSleepPlainBenchmark.sleep       avgt   40  1,112 \u00b1 0,003  ms\/op ThreadSleepPlainBenchmark.sleepNanos  avgt   40  1,117 \u00b1 0,001  ms\/op  Java 17 MacOS  Benchmark                             Mode  Cnt  Score   Error  Units ThreadSleepPlainBenchmark.sleep       avgt   40  1,363 \u00b1 0,008  ms\/op ThreadSleepPlainBenchmark.sleepNanos  avgt   40  1,364 \u00b1 0,010  ms\/op<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"java\">@BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class ThreadSleepPlainBenchmark {    @Benchmark   public void sleepZero() throws Exception {     Thread.sleep(0);   } }<\/code><\/pre>\n<p>\u0412\u044b\u0445\u043e\u0434\u0438\u0442:<\/p>\n<pre><code>Java 11 Linux  Benchmark                              Mode  Cnt    Score    Error   Units ThreadSleepPlainBenchmark.sleepZero    avgt   50  484,261 \u00b1  0,578   ns\/op  Java 11 MacOS  Benchmark                              Mode  Cnt    Score    Error   Units ThreadSleepPlainBenchmark.sleepZero    avgt   50  501,271 \u00b1 90,137   ns\/op  Java 17 Linux  Benchmark                              Mode  Cnt    Score    Error   Units ThreadSleepPlainBenchmark.sleepZero    avgt   50  493,227 \u00b1  4,881   ns\/op  Java 17 MacOS  Benchmark                              Mode  Cnt    Score    Error   Units ThreadSleepPlainBenchmark.sleepZero    avgt   40  371,817 \u00b1  6,669   ns\/op<\/code><\/pre>\n<p>\u041d\u0435 \u0442\u043e\u0440\u043e\u043f\u0438\u0442\u0435\u0441\u044c \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u043e\u043b\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0435 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0438 \u0446\u0438\u0444\u0440\u044b, \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0431\u0437\u0430\u0446\u0435\u0432 \u043c\u044b \u043a \u043d\u0438\u043c \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 &#171;\u0443\u0441\u044b\u043f\u043b\u0435\u043d\u0438\u0435&#187; \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043e\u0441\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 0,1-0,3 \u043c\u0441, \u0447\u0442\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 10-30% (!) \u043e\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u041e\u043b\u044c\u0448\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0432 \u0446\u0438\u043a\u043b\u0430\u0445.<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u044b\u043b\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441 \u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u0430 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438, \u0430 \u0442\u043e \u0438 \u0441\u043e\u0442\u043d\u044f\u043c\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434?<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0435\u0449\u0451 \u0441 Java 5 <code>LockSupport.parkNanos(long)<\/code>, \u043a\u0430\u043a \u0438 <code>Thread.sleep()<\/code> \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>Thread.State.TIMED_WAITING<\/code>. \u0415\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u043c\u0438\u043c\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u043d\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c &#171;\u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c&#187; \u043f\u043e\u0442\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>LockSupport.unpark(Thread)<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041d\u043e \u0438 \u0442\u0443\u0442 \u0432\u0441\u0451 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"java\">@State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class ParkNanosBenchmark {    @Param({\"10\", \"100\", \"1000\", \"10000\", \"1000000\"})   long delay;    @Benchmark   public void parkNanos() {     LockSupport.parkNanos(delay);   } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>Java 11 Linux  Benchmark                      (delay)  Mode  Cnt        Score      Error  Units ParkNanosBenchmark.parkNanos        10  avgt   40    57713,345 \u00b1  165,827  ns\/op ParkNanosBenchmark.parkNanos       100  avgt   40    57672,554 \u00b1  444,892  ns\/op ParkNanosBenchmark.parkNanos      1000  avgt   40    58646,654 \u00b1  120,040  ns\/op ParkNanosBenchmark.parkNanos     10000  avgt   40    68222,650 \u00b1  115,751  ns\/op ParkNanosBenchmark.parkNanos   1000000  avgt   40  1103499,893 \u00b1 7793,704  ns\/op  Java 11 MacOS  Benchmark                      (delay)  Mode  Cnt        Score       Error  Units ParkNanosBenchmark.parkNanos        10  avgt   40    11395,046 \u00b1   250,512  ns\/op ParkNanosBenchmark.parkNanos       100  avgt   40     9171,332 \u00b1  1117,377  ns\/op ParkNanosBenchmark.parkNanos      1000  avgt   40     4781,591 \u00b1    82,799  ns\/op ParkNanosBenchmark.parkNanos     10000  avgt   40    17750,419 \u00b1   256,214  ns\/op ParkNanosBenchmark.parkNanos   1000000  avgt   40  1403117,216 \u00b1 42218,338  ns\/op  Java 17 Linux  Benchmark                      (delay)  Mode  Cnt        Score       Error  Units ParkNanosBenchmark.parkNanos        10  avgt   40    57331,896 \u00b1   606,789  ns\/op ParkNanosBenchmark.parkNanos       100  avgt   40    57701,988 \u00b1   151,346  ns\/op ParkNanosBenchmark.parkNanos      1000  avgt   40    58585,929 \u00b1   119,138  ns\/op ParkNanosBenchmark.parkNanos     10000  avgt   40    67984,687 \u00b1   186,378  ns\/op ParkNanosBenchmark.parkNanos   1000000  avgt   40  1093718,818 \u00b1  7665,960  ns\/op  Java 17 MacOS  Benchmark                      (delay)  Mode  Cnt        Score       Error  Units ParkNanosBenchmark.parkNanos        10  avgt   40    11446,015 \u00b1   243,118  ns\/op ParkNanosBenchmark.parkNanos       100  avgt   40    10283,453 \u00b1   148,363  ns\/op ParkNanosBenchmark.parkNanos      1000  avgt   40     5085,643 \u00b1    31,031  ns\/op ParkNanosBenchmark.parkNanos     10000  avgt   40    17582,777 \u00b1   159,145  ns\/op ParkNanosBenchmark.parkNanos   1000000  avgt   40  1369327,409 \u00b1  9468,778  ns\/op<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430: \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u041b\u0438\u043d\u0443\u043a\u0441\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 50 \u043c\u043a\u0441. \u041e\u043d (\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a) \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0441\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f &#171;\u0437\u0430\u0441\u044b\u043f\u0430\u043d\u0438\u044f&#187; \u0432\u0441\u0435\u0433\u0434\u0430 \u043a\u0440\u0430\u0442\u043d\u043e \u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0441\u0438 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0431\u043b\u043e\u0433\u0435 <a href=\"https:\/\/hazelcast.com\/blog\/locksupport-parknanos-under-the-hood-and-the-curious-case-of-parking\/\" rel=\"noopener noreferrer nofollow\">\u0425\u0435\u0439\u0437\u0435\u043b\u043a\u0430\u0441\u0442<\/a>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>Thread.sleep(0)<\/code> \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e: \u043e\u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043a \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>Thread.State.TIMED_WAITING<\/code> \u0438 \u043d\u0435 \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0421 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u043e\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0430 MacOS \u044f \u043d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f, \u043d\u0430 <a href=\"https:\/\/stackoverflow.com\/questions\/72870049\/does-minimum-java-lang-thread-suspend-time-depend-on-os-or-cpu\" rel=\"noopener noreferrer nofollow\">\u0421\u041e<\/a> \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u043e\u043b\u043a\u043e\u043c \u043d\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b\u0438. \u041f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044e, \u0447\u0442\u043e \u0432 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u043e\u0440\u043e\u0447\u0435 1 \u043c\u043a\u0441 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044e, \u0447\u0442\u043e \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 <code>delay = 100<\/code> \u0438 <code>delay = 1000<\/code> \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0441\u044f \u0432\u043e\u0432\u0441\u0435).<\/p>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b \u0438\u0437 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <code>Thread.sleep()<\/code> \u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u044b \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435 \u043a\u043e\u0440\u043e\u0447\u0435 1,1-1,3 \u043c\u0441<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043f\u0430\u0443\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>LockSupport.parkNanos()<\/code><\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u0440\u0430\u0442\u043d\u044b \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u041e\u0421<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430 \u041b\u0438\u043d\u0443\u043a\u0441\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0442\u043e\u043d\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u044b\u043b \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438:<\/p>\n<pre><code class=\"java\">long delay = 1L;  volatile<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-336837","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/336837","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=336837"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/336837\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=336837"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=336837"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=336837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}