{"id":475236,"date":"2025-09-16T12:49:20","date_gmt":"2025-09-16T12:49:20","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=475236"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=475236","title":{"rendered":"Java 25 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0443\u0436\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044c \u0432\u0435\u043a\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f\u0437\u044b\u043a, \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u00ab\u0443\u043c\u043d\u044b\u0445 \u0442\u043e\u0441\u0442\u0435\u0440\u043e\u0432\u00bb, \u0441\u0442\u0430\u043b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430 \u0438 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0421\u0435\u0433\u043e\u0434\u043d\u044f Java \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0432\u0441\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u0441\u0442\u0435\u0440\u0435\u043e\u0442\u0438\u043f \u043e \u00ab\u0442\u044f\u0436\u0451\u043b\u043e\u043c \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0434\u0438\u043d\u043e\u0437\u0430\u0432\u0440\u0435\u00bb. \u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0439\u0442\u0435 25 \u0432\u0435\u0440\u0441\u0438\u044e Java \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <a href=\"https:\/\/t.me\/+QmrKn0wA8CdkNjAy\">Spring \u0410\u0439\u041e<\/a>!<\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0438\u0447\u0438:<\/h2>\n<h3>JEP 520: \u041c\u0435\u0442\u043e\u0434-\u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0438 \u0442\u0430\u0439\u043c\u0438\u043d\u0433 \u0432 JFR \u2014 \u0437\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u0435\u0437 \u043a\u043e\u0434\u0430 \u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432<\/h3>\n<p>\u0412 Java 25 JFR (Java Flight Recorder) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u2014 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u0431\u0435\u0437 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0431\u0435\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 Java-\u0430\u0433\u0435\u043d\u0442\u043e\u0432.<\/p>\n<h4>\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e?<\/h4>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0438\u043b\u0438 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0442\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0411\u0414. \u0420\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c:<\/p>\n<ul>\n<li>\n<p>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c JFR-\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043a\u043e\u0434<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0430\u0433\u0435\u043d\u0442 \u0447\u0435\u0440\u0435\u0437 <code>-javaagent<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0441 sampling-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Spring AOP \u0438 <code>@Around<\/code>-\u0430\u0441\u043f\u0435\u043a\u0442\u044b<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0449\u0435: \u0442\u043e\u0447\u043d\u043e, \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0438 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439.<\/p>\n<h4>\u0427\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438?<\/h4>\n<p>\u0414\u0432\u0430 \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 JFR:<\/p>\n<ul>\n<li>\n<p><code>jdk.MethodTiming<\/code> \u2014 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b, \u0437\u0430\u043c\u0435\u0440\u044f\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0435, \u043c\u0438\u043d\/\u043c\u0430\u043a\u0441 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><code>jdk.MethodTrace<\/code> \u2014 \u043f\u0438\u0448\u0435\u0442 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u0430 \u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435: \u0432\u0441\u0451 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438, \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435!<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h4>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0438 \u043a\u0430\u043a \u0434\u043e\u043b\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>HashMap::resize<\/code>.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a:<\/p>\n<pre><code class=\"bash\">java -XX:StartFlightRecording=method-trace=java.util.HashMap::resize,filename=resize.jfr ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437:<\/p>\n<pre><code class=\"bash\">jfr print --events jdk.MethodTrace resize.jfr<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430:<\/p>\n<pre><code class=\"json\">jdk.MethodTrace {startTime = 00:39:26.379duration = 0.00113 msmethod = java.util.HashMap.resize()eventThread = \"main\"stackTrace = [  java.util.HashMap.putVal(...)  java.util.HashMap.put(...)  ...  java2d.J2Ddemo.main(String[]) line: 674  ]}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041a\u0430\u043a \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?<\/h4>\n<p>\u0417\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 <code>&lt;clinit&gt;<\/code> \u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442:<\/p>\n<pre><code class=\"bash\">-XX:StartFlightRecording:method-timing=::&lt;clinit&gt;,filename=init.jfr<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 <code>@Get<\/code> \u0438\u0437 JAX-RS:<\/p>\n<pre><code class=\"bash\">jcmd &lt;pid&gt; JFR.start method-timing=@jakarta.ws.rs.GET<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"xml\">&lt;setting name=\"filter\"&gt;com.example.Foo::doSomething;com.example.Bar::handle&lt;\/setting&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442?<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 .jfr-\u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0435\u0440\u0435\u0437 jfr print \u0438\u043b\u0438 jfr view<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432 JDK Mission Control<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 JMX\/RemoteRecordingStream<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0447\u0451\u043c \u043f\u043e\u043b\u044c\u0437\u0430?<\/p>\n<ul>\n<li>\n<p>\u0411\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/p>\n<\/li>\n<li>\n<p>\u0422\u043e\u0447\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 FileDescriptor::close<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u0443, \u0441\u0442\u0430\u043b \u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0431\u0435\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u0434\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 \u0438\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c <code>-javaagent<\/code>. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u0438 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<h3>JEP 502: Stable Values<\/h3>\n<p>502 JEP \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 \u0432 \u044d\u0442\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/companies\/spring_aio\/articles\/942118\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>, \u043e\u043d \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u0440\u0438\u043d\u0435\u0441\u0451\u0442 \u0432 Java \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0421 \u044d\u0442\u0438\u043c \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438! \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 HotSpot JIT \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c <a href=\"https:\/\/en.wikipedia.org\/wiki\/Constant%5C_folding\">\u0441\u0432\u0451\u0440\u0442\u043a\u0443 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442<\/a> (constant-folding) \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u043e\u0439 StableValue. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u0442\u0438\u043f\u0430 StableValue \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 (\u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438\u00a0 static final), \u043b\u0438\u0431\u043e \u0435\u0441\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 StableValue \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0439 (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435).<\/p>\n<h4>\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442<\/h4>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0434\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043b\u043e\u0433\u0433\u0435\u0440 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c stable \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 JDK 25:<\/p>\n<pre><code class=\"java\">public record OrderControllerImpl(Supplier&lt;Logger&gt; logger) implements OrderController {    @Override    public void submitOrder(User user, List&lt;Product&gt; products) {        logger.get().info(\"order started\");        \/\/ ...        logger.get().info(\"order submitted\");    }    \/**     * {@return a new OrderController}     *\/    public static OrderController create() {        return new OrderControllerImpl(                StableValue.supplier(                        () -&gt; Logger.create(OrderControllerImpl.class)));    }}private static final OrderControler ORDER_CONTROLLER = OrderControllerImpl.create();ORDER_CONTROLLER.submitOrder(...);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041f\u0430\u0432\u043b\u0430 \u041a\u0438\u0441\u043b\u043e\u0432\u0430:<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u0442\u0440\u0430\u0445\u0443\u0435\u0442 \u0432\u0430\u0448 \u043a\u043e\u0434 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>record<\/code>. \u0412 java \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043a\u0440\u044b\u0442\u044c canonical constuctor \u0432 record, \u043a\u0430\u043a \u0432 scala \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u0432 Dart. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 &#8212; \u044d\u0442\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c &#171;\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>create()<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430&#187;.\u00a0<\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e <code>record<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0443 <code>record final<\/code> \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. JVM \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043a \u043d\u0438\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f builder-pattern \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u0417\u0434\u0435\u0441\u044c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0440\u044e\u043a, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 logger \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f, \u2014 \u0447\u0435\u0440\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 record. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b record-\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438:<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u043e\u0434 \u0432\u044b\u0448\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c immutable logger, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043b\u0435\u043d\u0438\u0432\u043e, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c JIT \u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0441\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a <code>final<\/code> \u043f\u043e\u043b\u0435 (\u0412 Java \u0443\u0436\u0435 \u0434\u043e\u043b\u0433\u0438\u0435 \u0433\u043e\u0434\u044b \u0435\u0441\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>@Stable<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u041e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u043b\u0443, \u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435)<\/p>\n<p>\u0423 \u043e\u043f\u044b\u0442\u043d\u043e\u0433\u043e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0447\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>logger<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0434\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u0447\u0435\u043c \u0442\u0430\u043a \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u0436\u0438\u0437\u043d\u044c? \u0412\u0435\u0434\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c:<\/p>\n<pre><code class=\"java\">public record OrderControllerImpl(Logger logger) implements OrderController {    @Override    public void submitOrder(User user, List&lt;Product&gt; products) {        logger.info(\"order started\");        \/\/ ...        logger.info(\"order submitted\");    }    \/** {@return a new OrderController} *\/    public static OrderController create() {        return new OrderControllerImpl(Logger.create(OrderControllerImpl.class));    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u043e\u0436\u0435 \u043d\u0435\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0447\u0435\u0440\u0435\u0437 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u0430 \u0438\u0434\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a Logger. \u041d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 <code>logger<\/code> \u0432 heap \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f eagerly. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e. \u0418\u043d\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u044f\u0436\u0435\u043b\u044b\u0439, \u0438 \u043d\u0435 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u043d \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f. \u0418 \u0435\u0433\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u043d\u0438\u0432\u043e. \u0418 <code>StableValue<\/code> \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0432\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441 JIT \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u0433\u0434\u0435 \u0412\u044b \u0435\u043c\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435 &#8212; \u0434\u0440\u0443\u0436\u0438\u0449\u0435, \u0441\u043c\u043e\u0442\u0440\u0438, \u044f \u0442\u0435\u0431\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e, \u0447\u0442\u043e \u0442\u0430 \u0441\u0441\u044b\u043b\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u043e\u0434\u044c\u044e\u0441\u0438\u0440\u0443\u0435\u0442 <code>StableValue<\/code> &#8212; \u043e\u043d\u0430 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0441\u0430\u043c \u0434\u0438\u0437\u0430\u0439\u043d <code>StableValue<\/code> \u043d\u0435 \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u0435\u0451 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c). \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0444\u043e\u043b\u0434\u0438\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e, \u043c\u043e\u0436\u0435\u0448\u044c \u043c\u043d\u0435 \u0432\u0435\u0440\u0438\u0442\u044c, \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0442\u044b \u0434\u0435\u043b\u0430\u043b\u0430 \u0441 <code>@Stable<\/code> \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432 JVM. \u0418 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043f\u043e \u0441\u0443\u0442\u0438 \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f. \u0412\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 immutable \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0435 \u0435\u0433\u043e \u043b\u0435\u043d\u0438\u0432\u043e, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u043e\u0442 \u0432 \u0447\u0451\u043c \u0441\u0443\u0442\u044c.<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u043e\u0442 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u044f (non-evicting), \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c API stable \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"java\">private static final Function&lt;Integer, Double&gt; SQRT_CACHE =\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0StableValue.function(ffff, i -&gt; StrictMath.sqrt(i));...\/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0435\u043d\u0438\u0432\u043e, \u043d\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0432\u0451\u0440\u043d\u0443\u0442\u043e JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c -&gt; 4double sqrt16 = SQRT_CACHE.apply(16);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 <code>SQRT_CACHE<\/code> \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 4, \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>sqrt()<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 <code>SQRT_CACHE<\/code>. \u0418 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u043a\u043e\u0433\u0434\u0430 JIT \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435, \u0442\u043e \u043e\u043d \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0432\u0451\u0440\u0442\u043a\u0443 \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>sqrt(16)<\/code> \u0438 \u0441\u0445\u043b\u043e\u043f\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 &#8212; 4.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438:<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u043e\u0439 Lazy \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u0432\u044b \u0431\u044b \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c JIT-\u0443 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 <code>sqrt()<\/code> \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u044b\u043b \u0431\u044b <code>final<\/code> \u043f\u043e\u043b\u0435\u043c, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u043e \u043d\u0438 \u043e \u0447\u0451\u043c \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442. \u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043c\u044b \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0442\u0430\u0442\u044c\u044e \u043e \u0442\u043e\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 <code>final<\/code> \u043f\u043e\u043b\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <code>final<\/code>.<\/p>\n<\/div>\n<\/details>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0437\u0432\u0430\u043b\u0438 Lazy?<\/h4>\n<p>\u042d\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u044b\u0439 \u0447\u0430\u0441\u0442\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u043e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u00ab\u043b\u0435\u043d\u0438\u0432\u043e\u0433\u043e\u00bb (lazy) \u043f\u043e\u043b\u044f \u2014 \u044d\u0442\u043e \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u00ab\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e\u00bb (stable) \u043f\u043e\u043b\u044f. \u041e\u0431\u0430 \u0442\u0438\u043f\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442 \u043b\u0435\u043d\u0438\u0432\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043e ahead-of-time (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f).<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 <code>StableValue<\/code> \u0438 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0435\u0451, \u043a\u0430\u043a \u0432\u0430\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Lazy, \u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"java\">@FunctionalInterfaceinterface Lazy&lt;T&gt; extends Supplier&lt;T&gt; {    static &lt;T&gt; Lazy&lt;T&gt; of(Supplier&lt;? extends T&gt; original) {        return StableValue.supplier(original)::get;    }}private static final Lazy&lt;String&gt; httpResponse = Lazy.of(() -&gt; retrieveHttp(...));System.out.println(\"The response was \"+httpResponse.get());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b (\u043a\u0430\u043a <code>StableValue.supplier(original)::get<\/code> \u0432\u044b\u0448\u0435) \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u044b\u0442\u044b\u0445 (hidden) \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0418\u043c \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0442\u0435 \u0436\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u0451\u0440\u0442\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u0447\u0442\u043e \u0438 <code>StableValue.supplier()<\/code>, \u0438 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438:<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0420\u0435\u0447\u044c \u043f\u0440\u043e JEP 371. Hidden \u043a\u043b\u0430\u0441\u0441\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0430\u043c\u0430 JVM \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u0430\u043a \u0432\u043e\u0442 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 method reference \u0432 <code>StableValue.supplier()::get<\/code>, \u0433\u0434\u0435 VM \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 hidden \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 Lazy\/Supplier \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<p>JIT \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0445 \u0442\u043e\u0436\u0435 trusted source-\u043e\u043c \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u0440\u043e\u0434\u0443 \u043f\u0440\u0438\u0447\u0438\u043d, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c JEP \u0434\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430.<\/p>\n<\/div>\n<\/details>\n<h4>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e final-\u043f\u043e\u043b\u044f\u0445<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e JDK \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0434\u043e\u0432\u0435\u0440\u0438\u0435 \u0438 \u043a final-\u043f\u043e\u043b\u044f\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f stable \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u2014 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0451 \u0435\u0449\u0451 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u044f \u0441\u0432\u0451\u0440\u0442\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0443\u0436\u0435 <a href=\"https:\/\/openjdk.org\/jeps\/8349536\">\u0441\u0434\u0435\u043b\u0430\u043d<\/a>.<\/p>\n<h3>Scoped Values (JEP 506)<\/h3>\n<p>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a\u0438:<\/p>\n<pre><code class=\"java\">ScopedValue&lt;String&gt; USER = ScopedValue.newInstance();ScopedValue.where(USER, \"admin\").run(() -&gt;\u00a0\u00a0\u00a0\u00a0System.out.println(USER.get()) \/\/ admin);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>ScopedValue<\/code> \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f, \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0435\u043c\u0430, \u043e\u043d\u0430 \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0435\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0415\u0441\u043b\u0438 \u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441, \u0442\u043e \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u0438 \u043f\u0440\u043e <code>ScopedValue<\/code>.\u00a0<\/p>\n<h3>Structured Concurrency (JEP 505)<\/h3>\n<p>API structured concurrency \u0432\u043d\u043e\u0432\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u2014 \u043f\u043e\u0441\u043b\u0435 \u0434\u0432\u0443\u0445 \u0438\u043d\u043a\u0443\u0431\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0438 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u043f\u0440\u0435\u0432\u044c\u044e. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u0442\u0430\u043a\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u043c. \u041e\u0434\u043d\u0430\u043a\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u0443\u0441 API \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u2014 \u043a\u0430\u043a \u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \u042d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u0438 \u043d\u0430 \u0437\u0440\u0435\u043b\u043e\u0441\u0442\u044c API, \u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u0434\u0430, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a.<\/p>\n<h4>\u0427\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e structured concurrency \u0435\u0449\u0451 \u0432 \u0438\u043d\u043a\u0443\u0431\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0444\u0430\u0437\u0435, \u043c\u0435\u043d\u044f \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u043b\u0430 \u0438\u0434\u0435\u044f \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0433\u043e concurrent \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u0430: \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0441\u0435 \u043f\u043e\u0440\u043e\u0436\u0434\u0451\u043d\u043d\u044b\u0435 (spawned) \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f \u0434\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0431\u043b\u043e\u043a\u0430. \u0412 \u0442\u0435\u043e\u0440\u0438\u0438 \u0437\u0432\u0443\u0447\u0430\u043b\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043d\u043e API \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u0438 \u0437\u0430 \u044d\u0442\u0438\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0431\u044b\u043b\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0443\u0441\u043b\u0435\u0434\u0438\u0442\u044c.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0432 <a href=\"https:\/\/openjdk.org\/jeps\/505\">JEP 505<\/a> \u043f\u0440\u0438\u0432\u043d\u0435\u0441\u043b\u0430 \u0432\u0430\u0436\u043d\u044b\u0435 \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u043c. \u0421\u0430\u043c\u043e\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u0434\u0430\u0447 \u0438 \u043b\u0443\u0447\u0448\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f\u0445 \u0438 \u043f\u043e\u044f\u0441\u043d\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d\u0438 \u0432\u0430\u0436\u043d\u044b.<\/p>\n<h4>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0439<\/h4>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u043a\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0448\u0438\u0442\u044c structured concurrency. \u0412 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u0441\u043a\u0430\u043c\u0438 \u0447\u0430\u0441\u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u044b\u043c:<\/p>\n<pre><code class=\"java\">import java.util.Random;import java.util.concurrent.*;public class TraditionalConcurrencyExample {    private static final Random random = new Random();    private static String fetchUserData(String userId) throws InterruptedException {        Thread.sleep(1000 + random.nextInt(2000)); \/\/ 1-3 seconds        if (random.nextBoolean()) {            throw new RuntimeException(\"User service unavailable\");        }        return \"UserData[\" + userId + \"]\";    }    private static String fetchUserPreferences(String userId) throws InterruptedException {        Thread.sleep(800 + random.nextInt(1500)); \/\/ 0.8-2.3 seconds        if (random.nextBoolean()) {            throw new RuntimeException(\"Preferences service down\");        }        return \"Preferences[\" + userId + \"]\";    }    private static String combineUserInfo(String userData, String preferences) {        return userData + \" + \" + preferences;    }    public static String getUserInfoTraditional(String userId) throws Exception {        try (ExecutorService executor = Executors.newCachedThreadPool()) {            Future&lt;String&gt; future1 = executor.submit(() -&gt; fetchUserData(userId));            Future&lt;String&gt; future2 = executor.submit(() -&gt; fetchUserPreferences(userId));            try {                String userData = future1.get();                String preferences = future2.get();                return combineUserInfo(userData, preferences);            } catch (Exception e) {                \/\/ Cleanup is messy - what about the other task?                System.out.println(\"Error occurred, attempting cleanup...\");                future1.cancel(true);                future2.cancel(true);                throw e;            }        }    }    void main() {        for (int i = 0; i &lt; 5; i++) {            try {                System.out.println(\"Attempt \" + (i + 1) + \": \" +                        getUserInfoTraditional(\"user123\"));            } catch (Exception e) {                System.out.println(\"Attempt \" + (i + 1) + \" failed: \" +                        e.getMessage());            }            System.out.println();        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>\u0421\u043b\u043e\u0436\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a: \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0443\u0442\u0435\u0447\u043a\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u0432: \u0432\u044b \u0441\u0430\u043c\u0438 \u043d\u0435\u0441\u0451\u0442\u0435 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439: \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u0435 (checked) \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0438: \u0435\u0441\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e, \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>Structured concurrency \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u0430 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<h4>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435: \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/h4>\n<p>\u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0435 \u043d\u043e\u0432\u0448\u0435\u0441\u0442\u0432\u043e \u0432 JEP 505 \u2014 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>new StructuredTaskScope&lt;&gt;()<\/code>. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>open()<\/code>:<\/p>\n<pre><code class=\"java\">try (var scope = StructuredTaskScope.open()) {\u00a0\/\/ ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>open()<\/code> \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u044c (scope), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u043b\u0438\u0431\u043e \u0441\u0431\u043e\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0439 \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u00ab\u0432\u0441\u0435-\u0438\u043b\u0438-\u043e\u0448\u0438\u0431\u043a\u0430\u00bb (\u201call-or-fail\u201d). \u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 open(joiner) \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 Joiner (\u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435). \u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430? \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438, \u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e, \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0431\u0435\u0437 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u0432\u0430\u0448\u0438\u043c \u043a\u043e\u0434\u043e\u043c. \u042f \u0441\u0447\u0438\u0442\u0430\u044e \u044d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443\u0434\u0430\u0447\u043d\u044b\u043c: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u043c \u0438 \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e API:<\/p>\n<pre><code class=\"java\">public static String getUserInfoTraditional(String userId) throws Exception {    try (var scope = StructuredTaskScope.open()) {        StructuredTaskScope.Subtask&lt;String&gt; task1 = scope.fork(() -&gt; fetchUserData(userId));        StructuredTaskScope.Subtask&lt;String&gt; task2 = scope.fork(() -&gt; fetchUserPreferences(userId));        scope.join();        String userData = task1.get();        String preferences = task2.get();        return combineUserInfo(userData, preferences);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u0430. \u0421 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c structured concurrency \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e. \u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u043b\u0438\u0431\u043e \u0438\u0437 \u0437\u0430\u0434\u0430\u0447 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0442\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f (\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c), \u0432\u0441\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f. \u042d\u0442\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c\u043e \u0441 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c <em>try-with-resources<\/em> \u2014 \u043d\u043e \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0430\u0451\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0446\u0435\u043d\u044e:<\/p>\n<ul>\n<li>\n<p>\u0413\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430: \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0436\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u042f\u0432\u043d\u043e\u0435 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435: \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445: \u0441\u0431\u043e\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438: \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0443\u043b\u0430\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u044c: scope-\u044b\/\u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<h4>Joiner&#8217;\u044b: \u0437\u0430\u0434\u0430\u0451\u043c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0443\u0441\u043f\u0435\u0445\u0430<\/h4>\n<p>Joiner \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442:<\/p>\n<ol>\n<li>\n<p>\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438 \u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 (\u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435) \u0437\u0430\u0434\u0430\u0447\u0438,<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>join()<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>JDK \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u043e\u0432 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432: <\/p>\n<p>\u00ab\u041f\u043e\u0431\u0435\u0436\u0434\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u0430\u044f\u00bb (\u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u0430\u043a \u0433\u043e\u043d\u043a\u0430 \u0440\u0435\u043f\u043b\u0438\u043a).<\/p>\n<pre><code class=\"java\">try (var scope = StructuredTaskScope.open(Joiner.&lt;String&gt;anySuccessfulResultOrThrow())) {\u00a0\u00a0\u00a0urls.forEach(url -&gt; scope.fork(() -&gt; fetchFrom(url)));\u00a0\u00a0\u00a0return scope.join(); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ returns first successful String}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u00ab\u0412\u0441\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0438 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\u00bb<\/p>\n<pre><code class=\"java\">try (var scope = StructuredTaskScope.open(Joiner.&lt;Result&gt;allSuccessfulOrThrow())) {\u00a0\u00a0\u00a0tasks.forEach(scope::fork);\u00a0\u00a0\u00a0return scope.join()\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Stream&lt;Subtask&lt;Result&gt;&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.map(Subtask::get)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.toList();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u2014 \u00ab\u0433\u043e\u043d\u043a\u0430\u00bb (\u201crace\u201d), \u00ab\u0441\u0431\u043e\u0440\u00bb (\u201cgather\u201d), \u00ab\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445\u00bb (\u201cwait-for-all\u201d).<\/p>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e Joiner&#8217;\u0430<\/h4>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u044f \u0445\u043e\u0447\u0443 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0432 \u0441\u0431\u043e\u0438:<\/p>\n<pre><code class=\"java\">import java.util.Queue;import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.StructuredTaskScope;import java.util.stream.Stream;void main() {  List&lt;String&gt; urls = List.of(\"https:\/\/bazlur.ca\", \"https:\/\/foojay.io\", \"https:\/\/github.com\");  try (var scope = StructuredTaskScope.open(new MyCollectingJoiner&lt;String&gt;())) {    urls.forEach(url -&gt; scope.fork(() -&gt; fetchFrom(url)));    List&lt;String&gt; fetchedContent = scope.join().toList();    System.out.println(\"Total fetched content: \" + fetchedContent.size());  } catch (InterruptedException e) {    throw new RuntimeException(e);  }}private String fetchFrom(String url) {  return \"fetched from \" + url + \"\";}class MyCollectingJoiner&lt;T&gt; implements StructuredTaskScope.Joiner&lt;T, Stream&lt;T&gt;&gt; {  private final Queue&lt;T&gt; results = new ConcurrentLinkedQueue&lt;&gt;();  @Override  public boolean onComplete(StructuredTaskScope.Subtask&lt;? extends T&gt; st) {    if (st.state() == StructuredTaskScope.Subtask.State.SUCCESS)      results.add(st.get());    return false;  }  @Override  public Stream&lt;T&gt; result() {    return results.stream();  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0435\u043d \u2014 <code>onFork<\/code>, <code>onComplete<\/code> \u0438 <code>result()<\/code> \u2014 \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f JDK 25, \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">java --enable-preview CollectingJoiner.java<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Spring \u0410\u0439\u041e, \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438:<\/summary>\n<div class=\"spoiler__content\">\n<p>Java 25 GA \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0435\u0449\u0451 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u0432\u044b\u0448\u043b\u0430. \u0412\u044b\u0445\u043e\u0434 25-\u043e\u0439 Java \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c 2025. \u041f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e early access \u0431\u0438\u043b\u0434\u044b<\/p>\n<\/div>\n<\/details>\n<h4>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0430\u044f \u043e\u0442\u043c\u0435\u043d\u0430 \u0438 \u0434\u0435\u0434\u043b\u0430\u0439\u043d\u044b<\/h4>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043e\u0442\u043c\u0435\u043d\u044b \u043f\u043e \u0441\u0443\u0442\u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c, \u043d\u043e API \u0441\u0442\u0430\u043b \u0441\u0442\u0440\u043e\u0436\u0435. \u0415\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a-\u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0438\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0437\u043e\u0432\u0430\u00a0<code>join()<\/code>, \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u00a0<code>InterruptedException;<\/code>\u00a0\u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u00a0<code>close()<\/code>\u00a0\u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0438\u0445 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f. (\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0432\u043e\u0434-\u0432\u044b\u0432\u043e\u0434 \u2014 \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435; \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 polling \u2014 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u00a0<code>Thread.currentThread().isInterrupted().<\/code>)<\/p>\n<p>\u041d\u0443\u0436\u0435\u043d \u0434\u0435\u0434\u043b\u0430\u0439\u043d? \u041f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u043b\u044f\u043c\u0431\u0434\u0443:<\/p>\n<pre><code class=\"java\">try (var scope = StructuredTaskScope.open(         Joiner.&lt;String&gt;anySuccessfulResultOrThrow(),         cfg -&gt; cfg.withTimeout(Duration.ofSeconds(2)))) {    \/\/ ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0430\u0443\u0442, scope \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0430\u00a0<code>join()<\/code>\u00a0\u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u00a0<code>TimeoutException<\/code>. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044f \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u0432\u044b\u0437\u043e\u0432\u0443, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0430 \u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u0451\u0442 \u0438\u043c\u0435\u043d\u0430 \u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 thread-local \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"java\">ThreadFactory tagged = Thread.ofVirtual().name(\"api-%d\").factory();try (var scope = StructuredTaskScope.open(         Joiner.&lt;Integer&gt;allSuccessfulOrThrow(),         cfg -&gt; cfg.withThreadFactory(tagged))) {    \/\/ ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0434\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0435\u043b\u0430\u044e\u0442 \u0434\u0430\u043c\u043f\u044b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u0435\u0435.<\/p>\n<h4>ScopedValues \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438<\/h4>\n<p>\u0412\u0441\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438\u00a0<code>ScopedValues<\/code>, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e MDC \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043b\u044f\u043c\u0431\u0434\u0443. \u041e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0432 \u044d\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043a\u00a0<code>ThreadLocal<\/code>\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Spring \u0410\u0439\u041e:<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u0440\u043e Scoped Values \u043c\u044b \u043a\u0430\u043a-\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438. \u0412\u043e\u0442\u00a0<a href=\"https:\/\/t.me\/spring_aio\/115\">\u043f\u0435\u0440\u0432\u0430\u044f<\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/t.me\/spring_aio\/146\">\u0432\u0442\u043e\u0440\u0430\u044f<\/a>\u00a0\u0447\u0430\u0441\u0442\u0438.<\/p>\n<\/div>\n<\/details>\n<h4>\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h4>\n<p><code>StructuredTaskScope<\/code>\u00a0\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0415\u0441\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c\u00a0<code>fork()<\/code>\u00a0\u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430, \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0442 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430, \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u00a0<code>StructureViolationException<\/code>. \u0417\u0430\u0431\u044b\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<code>try-with-resources<\/code>\u00a0\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0438 scope \u0432\u044b\u0439\u0442\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043c\u0435\u0442\u043e\u0434\u0430? \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u043e\u0442 \u0436\u0435. \u041f\u043e\u0434\u0445\u043e\u0434 \u0441\u0442\u0440\u043e\u0433\u0438\u0439, \u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0438\u0441\u0442\u043e\u0449\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u00abfork-\u0431\u043e\u043c\u0431\u0430\u043c\u0438\u00bb).<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0420\u0435\u0447\u044c \u043f\u0440\u043e fork-bomb \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u0441\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 fork`\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Fork_bomb\">https:\/\/en.wikipedia.org\/wiki\/Fork_bomb<\/a><\/p>\n<\/div>\n<\/details>\n<h4>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 Observability<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c thread \u0434\u0430\u043c\u043f\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u043a\u043e\u0443\u043f\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u2013\u043f\u043e\u0442\u043e\u043c\u043e\u043a. \u041a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u00a0<code>jcmd &lt;pid&gt; Thread.dump_to_file -format=json<\/code>, \u043a\u0430\u0436\u0434\u044b\u0439 scope \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 forked \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0434 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c. \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0448\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u043b, \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434 \u0441 grep \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0441\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430.<\/p>\n<h4>\u0415\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438<\/h4>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 1 \u2014 360\u00b0-\u043e\u0431\u0437\u043e\u0440 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 (\u0441\u0431\u043e\u0440\u2013\u0437\u0430\u0442\u0435\u043c\u2013\u043e\u0448\u0438\u0431\u043a\u0430)<\/h4>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 endpoint \u0432 e-commerce: \u043e\u0434\u0438\u043d HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0446\u0435\u043d\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434\u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438\u00a0<code>StructuredTaskScope<\/code>, \u0433\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u00ab\u0432\u0441\u0451 \u0438\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e\u00bb: \u043b\u044e\u0431\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0438\u043b\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u043e\u0433\u043e \u0434\u0435\u0434\u043b\u0430\u0439\u043d\u0430 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u044e \u0433\u0440\u0443\u043f\u043f\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u043c\u0443.<\/p>\n<p>\u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u00a0<code>joiner allSuccessfulOrThrow()<\/code>\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\u00a0<code>CompletableFuture<\/code>, \u0432\u0441\u0435\u0433\u043e \u0432 \u0442\u0440\u0451\u0445 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\u0430\u0445.<\/p>\n<pre><code class=\"java\">import java.time.Duration;import java.util.Random;import java.util.concurrent.StructuredTaskScope;import java.util.concurrent.ThreadFactory;public class ThreeSixtyProductView {  record Product(long id, String name) {}  record Stock(long productId, int quantity) {}  record Price(long productId, double amount) {}  record ProductPayload(Product core, Stock stock, Price price) {}  private static Product coreApi(long id) throws InterruptedException {    Thread.sleep(100); \/\/ simulate latency    return new Product(id, \"Gadget\u2011\" + id);  }  private static Stock stockApi(long id) throws InterruptedException {    Thread.sleep(120);    return new Stock(id, new Random().nextInt(100));  }  private static Price priceApi(long id) throws InterruptedException {    Thread.sleep(150);    return new Price(id, 99.99);  }  static ProductPayload fetchProduct(long id) throws Exception {    ThreadFactory named = Thread.ofVirtual().name(\"prod-%d\", 1).factory();    try (var scope = StructuredTaskScope.open(        StructuredTaskScope.Joiner.&lt;Object&gt;allSuccessfulOrThrow(),        cfg -&gt; cfg.withTimeout(Duration.ofSeconds(1))            .withThreadFactory(named))) {      StructuredTaskScope.Subtask&lt;Product&gt; core = scope.fork(() -&gt; coreApi(id));      StructuredTaskScope.Subtask&lt;Stock&gt; stock = scope.fork(() -&gt; stockApi(id));      StructuredTaskScope.Subtask&lt;Price&gt; price = scope.fork(() -&gt; priceApi(id));      scope.join(); \/\/ throws on first failure \/ timeout      return new ProductPayload(core.get(), stock.get(), price.get());    }  }  void main() throws Exception {    ProductPayload productPayload = fetchProduct(1L);    System.out.println(productPayload);  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 2 \u2014 \u00ab\u0413\u043e\u043d\u043a\u0430 \u0437\u0435\u0440\u043a\u0430\u043b\u00bb \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432<\/h4>\n<p>\u041a\u0440\u0443\u043f\u043d\u044b\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u0435\u0440\u043a\u0430\u043b\u0430\u0445 CDN. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435 \u0437\u0435\u0440\u043a\u0430\u043b\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0430\u00a0<code>Joiner.anySuccessfulResultOrThrow()<\/code>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d\u043d\u043e\u0433\u043e\u00a0<code>InputStream<\/code>, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u0442\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p>\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e, \u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u2014 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043e\u0442\u043c\u0435\u043d\u044b.<\/p>\n<pre><code class=\"java\">import java.io.*;import java.net.URI;import java.nio.file.*;import java.util.List;import java.util.Random;import java.util.concurrent.StructuredTaskScope;public class MirrorDownloaderDemo {  void main() throws Exception {    List&lt;URI&gt; mirrors = List.of(        URI.create(\"https:\/\/mirror\u2011a.example.com\"),        URI.create(\"https:\/\/mirror\u2011b.example.com\"),        URI.create(\"https:\/\/mirror\u2011c.example.com\"));    Path target = Files.createFile(Path.of(\"download1.txt\"));    download(target, mirrors);    System.out.println(\"Saved to \" + target.toAbsolutePath());  }  static Path download(Path target, List&lt;URI&gt; mirrors) throws Exception {    try (var scope = StructuredTaskScope.open(        StructuredTaskScope.Joiner.&lt;InputStream&gt;anySuccessfulResultOrThrow())) {      mirrors.forEach(uri -&gt; scope.fork(() -&gt; fetchFromMirror(uri)));      try (InputStream in = scope.join()) {        Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);      }      return target;    }  }  private static InputStream fetchFromMirror(URI uri) throws InterruptedException {    Thread.sleep(50 + new Random().nextInt(300));    String data = \"Downloaded from \" + uri + \"\\n\";    return new ByteArrayInputStream(data.getBytes());  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 3 \u2014 \u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c\u0438<\/h4>\n<p>\u042d\u0442\u0430\u043f \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u043a\u043e\u0443\u043f \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u0444\u0430\u0439\u043b\u044b, \u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u2014 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u2014 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0435\u0449\u0451 \u043d\u0430 \u0442\u0440\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0435\u0441\u0430\u0439\u0437\u0430 (\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439, \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u044b). \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u043a\u043e\u0443\u043f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u00ab\u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043e\u0442\u043a\u0430\u0437\u00bb: \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0435\u0441\u0430\u0439\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u043a\u0443\u043e\u043f \u0438 \u0435\u0433\u043e \u0431\u0430\u0442\u0447\u0451\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u043a\u043e\u0443\u043f\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043e\u0431\u0449\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u0442\u0438\u0438 \u2014 \u043f\u0440\u0438 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0435 \u043a\u043e\u0434\u0430.<\/p>\n<pre><code class=\"java\">import java.io.IOException;import java.nio.file.*;import java.util.concurrent.StructuredTaskScope;public class ThumbnailBatchDemo {  enum Size {SMALL, MEDIUM, LARGE}  void main() throws Exception {    Path tmpDir = Files.createTempDirectory(\"images\");    for (int i = 0; i &lt; 3; i++) Files.createTempFile(tmpDir, \"img\" + i, \".jpg\");    processBatch(tmpDir);  }  static void processBatch(Path dir) throws IOException, InterruptedException {    try (var batch = StructuredTaskScope.open()) {      try (var files = Files.list(dir)) {        files.filter(Files::isRegularFile)            .forEach(img -&gt; batch.fork(() -&gt; handleOne(img)));      }      batch.join();    }  }  private static void handleOne(Path image) {    try (var scope = StructuredTaskScope.open(        StructuredTaskScope.Joiner.&lt;Void&gt;allSuccessfulOrThrow())) {      scope.fork(() -&gt; resizeAndUpload(image, Size.SMALL));      scope.fork(() -&gt; resizeAndUpload(image, Size.MEDIUM));      scope.fork(() -&gt; resizeAndUpload(image, Size.LARGE));      scope.join();    } catch (Exception ex) {      System.err.println(\"Skipping \" + image.getFileName() + \": \" + ex);    }  }  private static Void resizeAndUpload(Path image, Size size) throws InterruptedException {    Thread.sleep(80); \/\/ simulate resize    Thread.sleep(40); \/\/ simulate upload    System.out.println(\"Uploaded \" + image.getFileName() + \" [\" + size + \"]\");    return null;  }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 4 \u2014 \u0421\u043b\u0443\u0436\u0431\u0430 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443<\/h4>\n<p>\u0422\u0440\u0435\u0439\u0434\u0438\u043d\u0433\u043e\u0432\u044b\u0439 UI \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u0447\u0435\u043c \u0447\u0435\u0440\u0435\u0437 30 \u043c\u0441. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 joiner \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u0443\u044e \u0443\u0441\u043f\u0435\u0448\u043d\u0443\u044e \u0446\u0435\u043d\u0443 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0440\u044b\u043d\u043e\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432 30 \u043c\u0441. \u0415\u0441\u043b\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442,\u00a0<code>scope.join()<\/code>\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0447\u0435\u0440\u0430\u0448\u043d\u044e\u044e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0446\u0435\u043d\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f.<\/p>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043e\u0432\u0440\u0435\u043c\u044f, \u0430 \u0432\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439.<\/p>\n<pre><code class=\"java\">import java.time.Duration;import java.util.*;import java.util.concurrent.StructuredTaskScope;import java.util.concurrent.StructuredTaskScope.Subtask;public class QuoteServiceDemo {  void main() throws Exception {    double q = quote(\"ACME\");    System.out.printf(\"Quote for ACME: %.2f%n\", q);  }  static double quote(String symbol) throws InterruptedException {    var firstSuccess = new StructuredTaskScope.Joiner&lt;Double, Optional&lt;Double&gt;&gt;() {      private volatile Double value;      public boolean onComplete(Subtask&lt;? extends Double&gt; st) {        if (st.state() == Subtask.State.SUCCESS) value = st.get();        return value != null;           \/\/ stop when we have one      }      public Optional&lt;Double&gt; result() {        return Optional.ofNullable(value);      }    };    try (var scope = StructuredTaskScope.open(firstSuccess,        cfg -&gt; cfg.withTimeout(Duration.ofMillis(30)))) {      scope.fork(() -&gt; marketFeed(symbol));      Optional&lt;Double&gt; latest = scope.join();      return latest.orElseGet(() -&gt; cache(symbol));    }  }  private static double marketFeed(String symbol) throws InterruptedException {    long delay = new Random().nextBoolean() ? 20 : 60; \/\/ 50\u2006% chance timeout    Thread.sleep(delay);    return 100 + new Random().nextDouble();  }  \/\/for demo purposes only  private static double cache(String symbol) {    return 95.00;  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u044b\u0441\u043b\u0438<\/h4>\n<p>\u042d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u0442\u0430\u043f \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 API structured concurrency.<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f API structured concurrency \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0442\u043e\u0439, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c, \u0438 \u044f \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u043e\u043d\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0440\u043e\u0447\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 Java \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<h3>Primitive Types \u0432 pattern matching (JEP 507)<\/h3>\n<p>Java 25 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c pattern matching: \u0442\u0435\u043f\u0435\u0440\u044c \u0432 <code>instanceof<\/code> \u0438 <code>switch<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b!<\/p>\n<h4>\u0412 \u0447\u0435\u043c \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430?<\/h4>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 pattern matching \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438:<\/p>\n<pre><code class=\"java\">if (obj instanceof String s) { ... }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0431\u044b\u043b\u043e \u043d\u0435\u043b\u044c\u0437\u044f:<\/p>\n<pre><code class=\"java\"> if (x instanceof int i) { ... } \/\/ \u041e\u0448\u0438\u0431\u043a\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u0432\u044b \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>Integer<\/code>, \u0430 \u043d\u0435 <code>int<\/code>, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044f \u0431\u043e\u043a\u0441\u0438\u043d\u0433, \u0447\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u043e <code>switch<\/code> \u2014 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0431\u044b\u043b\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b: \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>switch<\/code> \u043d\u0430 <code>boolean<\/code>, <code>float<\/code>, <code>double<\/code>, <code>long<\/code> \u0438\u043b\u0438 \u0441 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c\u0438.<\/p>\n<h4>\u0427\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438? <\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442:<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0432 <code>instanceof<\/code>:<\/p>\n<pre><code class=\"java\">if (num instanceof byte b) { ... } \/\/ \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442, \u0432\u043b\u0435\u0437\u0430\u0435\u0442 \u043b\u0438 num \u0432 byte<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0438\u0441\u0430\u0442\u044c <code>switch<\/code> \u043f\u043e <code>boolean<\/code>, <code>long<\/code>, <code>float<\/code>, <code>double<\/code>:<\/p>\n<pre><code class=\"java\">switch (flag) {  case true -&gt; System.out.println(\"\u0414\u0430\");  case false -&gt; System.out.println(\"\u041d\u0435\u0442\");}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 <code>switch<\/code>:<\/p>\n<pre><code class=\"java\">switch (value) {  case 0 -&gt; System.out.println(\"\u041d\u043e\u043b\u044c\");  case int i when i &gt; 0 -&gt; System.out.println(\"\u041f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435: \" + i);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e?<\/h4>\n<ul>\n<li>\n<p>\u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043a\u0441\u0438\u043d\u0433 \u0434\u043b\u044f \u0440\u044f\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u0439 \u043f\u0435\u0440\u0444\u043e\u0440\u043c\u0430\u043d\u0441<\/p>\n<\/li>\n<li>\n<p>\u0443\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u043d\u0438\u0435 <code>if<\/code> \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0441\u0442\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><code>switch<\/code> \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c: \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u0438\u0442\u0447\u0438\u0442\u044c \u043f\u043e \u043b\u044e\u0431\u044b\u043c \u0442\u0438\u043f\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0432 <code>record<\/code>-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u0445 \u0438 <code>instanceof<\/code> \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0434\u0438\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043a\u0430\u043a \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0434\u0435\u043b\u0430\u044e\u0442 \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u0443\u0431\u0438\u0440\u0430\u044e\u0442 \u0440\u044f\u0434 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0431\u043e\u043a\u0441\u0438\u043d\u0433\u043e\u0432, if \u0441\u0442\u0435\u0439\u0442\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0442.\u0434, \u0447\u0435\u043c \u0443\u043b\u0443\u0447\u0448\u0430\u044e\u0442 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0438 \u0435\u0433\u043e performance.<\/p>\n<h3>Vector API (JEP 508, Tenth Incubator)\u00a0<\/h3>\n<p>\u041d\u043e\u0432\u044b\u0439 Vector API \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0431\u044b\u0441\u0442\u0440\u044b\u043c SIMD-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 Java:<\/p>\n<pre><code class=\"java\">var a = IntVector.fromArray(SPECIES, arr1, 0);var b = IntVector.fromArray(SPECIES, arr2, 0);var c = a.add(b); \/\/ \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0442\u0435\u043c\u0443 SIMD \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0443 \u043d\u0430\u0441 \u0442\u043e\u0436\u0435 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. SIMD \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0435\u043a\u0433\u0440\u0430\u0443\u043d\u0434\u0430 \u0434\u043b\u044f \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0442\u0443\u0442 \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442. \u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e &#8212; \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u0438 \u043f\u0440\u043e \u043d\u0438\u0445.<\/p>\n<h3>Module Import Declarations (JEP 511)<\/h3>\n<p>\u0412 Java 25 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0434\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0438\u0447\u0430: \u0438\u043c\u043f\u043e\u0440\u0442 \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u0434\u043d\u0438\u043c \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c. \u042d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430\u0445 \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438.<\/p>\n<h4>\u0412 \u0447\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430?<\/h4>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0443\u0447\u0443 \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432:<\/p>\n<pre><code class=\"java\">import java.util.*;import java.util.function.*;import java.util.stream.*;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c:<\/p>\n<pre><code class=\"java\"> import module java.base;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 <code>java.util<\/code>, <code>java.util.stream<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0441\u0440\u0430\u0437\u0443.<\/p>\n<h4>\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e?<\/h4>\n<ul>\n<li>\n<p>\u0411\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432, \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 JShell.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u044c \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u2014 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u0432 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0436\u0438\u0432\u0435\u0442 <code>List<\/code> \u0438\u043b\u0438 <code>Stream<\/code>.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438:<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0442\u0430\u043a\u043e\u0439 module-\u0438\u043c\u043f\u043e\u0440\u0442 \u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435\u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0445\u0443, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c, \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 import statement-\u044b \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043e\u0442\u043a\u0443\u0434\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441. \u041a\u0430\u043a \u0440\u0430\u0437 \u0437\u0430 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0443\u0433\u0430\u043b\u0438 \u0432 \u0441\u0432\u043e\u0451 \u0432\u0440\u0435\u043c\u044f wildcard imports.<\/p>\n<p>\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442 \u0441\u0430\u043c\u0430 IDE, \u0438 \u043d\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e, \u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u043a\u0446\u0438\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043d\u0435 \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u043f\u043e\u0440\u043d\u043e\u0435, \u043d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u043e\u0441\u0432\u0435\u0442\u0438\u0442\u044c.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"java\">import module java.sql;public class Demo {    public static void main(String[] args) throws Exception {        Connection conn = DriverManager.getConnection(\"jdbc:h2:mem:\");        Statement stmt = conn.createStatement();        stmt.execute(\"create table test(id int)\");        System.out.println(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430\");    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f <code>import module java.sql;<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 <code>java.sql<\/code> \u0438 <code>javax.sql<\/code> \u0441\u0440\u0430\u0437\u0443.<\/p>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/h4>\n<p><code>import module M;<\/code> \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438\u0437 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043c\u043e\u0434\u0443\u043b\u044f M<code>.<\/code><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <code>M<\/code> \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e.<\/p>\n<h4>\u0412\u0430\u0436\u043d\u043e:<\/h4>\n<p>\u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0430\u0436\u0435 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 (\u043d\u0435 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0445) \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u044b \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442:<\/p>\n<pre><code class=\"java\">import java.sql.Date; \/\/ \u0423\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435, \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043b\u0430\u0441\u0441 Date \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Java \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f, \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043c\u043d\u0435\u0435. <\/p>\n<p><code>import module<\/code> \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0449\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<h3>Compact Object Headers (JEP 519)<\/h3>\n<p>Java 25 \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u0443\u044e \u0444\u0438\u0447\u0443: \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (Compact Object Headers). \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 JVM \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u0438 \u043b\u0435\u0439\u0430\u0443\u0442\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Java Heap.<\/p>\n<h4>\u0412 \u0447\u0435\u043c \u0441\u0443\u0442\u044c, \u0435\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e?<\/h4>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 Java \u0435\u0441\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u2014 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 JVM \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, GC \u0438 \u0442.\u0434. \u041e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 96 \u0431\u0438\u0442 (12 \u0431\u0430\u0439\u0442) \u043d\u0430 64-\u0431\u0438\u0442\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445.<\/p>\n<p>\u0421 JEP 450 \u0432 Java 24 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0446\u0438\u044f \u0441\u0436\u0430\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0434\u043e 64 \u0431\u0438\u0442 (8 \u0431\u0430\u0439\u0442). JEP 519 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439, \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0439 \u0444\u0438\u0447\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0440\u043e\u0434\u0435.<\/p>\n<h4>\u0417\u0430\u0447\u0435\u043c?<\/h4>\n<ul>\n<li>\n<p>\u041c\u0438\u043d\u0443\u0441 22% \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 SPECjbb2015<\/p>\n<\/li>\n<li>\n<p>\u041c\u0438\u043d\u0443\u0441 8% CPU \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c<\/p>\n<\/li>\n<li>\n<p>\u041c\u0438\u043d\u0443\u0441 15% \u0441\u0431\u043e\u0440\u043e\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u0432 G1 \u0438 Parallel GC (\u0442.\u0435. \u0441\u0431\u043e\u0440\u043a\u0438 \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0440\u0435\u0436\u0435, \u0447\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e)<\/p>\n<\/li>\n<li>\n<p>+10% \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435,\u00a0SPECjbb2015 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 &#171;well-known&#187;\u0432\u043e\u0440\u043a\u043b\u043e\u0430\u0434 \u0434\u043b\u044f \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 + \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0443\u043b\u0438\u043d\u0433 \u0432\u043e\u043a\u0440\u0443\u0433 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0438 \u0438\u0445 \u0440\u0435\u043f\u043e\u0440\u0442\u0438\u043d\u0433\u0430. \u0415\u0433\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 OpenJDK \u043a\u0430\u043a \u043f\u043b\u0435\u0439\u0433\u0440\u0430\u0443\u043d\u0434 \u0434\u043b\u044f \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433\u0430 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430.<\/p>\n<h4>\u041a\u0430\u043a \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c?<\/h4>\n<p>\u0412 Java 25 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0444\u043b\u0430\u0433<\/p>\n<pre><code class=\"java\">-XX:+UnlockExperimentalVMOptions<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e:<\/p>\n<pre><code class=\"java\">java -XX:+UseCompactObjectHeaders ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0443\u0444\u044b?<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u043f\u0440\u043e\u0434\u0435 \u043d\u0430 \u0441\u043e\u0442\u043d\u044f\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 Amazon.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0433\u043d\u0430\u043d\u043e \u043f\u043e \u043f\u043e\u043b\u043d\u043e\u043c\u0443 \u0442\u0435\u0441\u0442-\u0441\u044c\u044e\u0442\u0443 JDK \u0432 Oracle.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0443\u0436\u0435 \u0431\u044d\u043a\u043f\u043e\u0440\u0442\u044f\u0442 \u0444\u0438\u0447\u0443 \u043d\u0430 JDK 21 \u0438 17.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c?<\/p>\n<ul>\n<li>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0435\u0441\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0438\u0447\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u0438\u0442\u043e\u0432 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 (\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 Valhalla \u0438 Lilliput).<\/p>\n<\/li>\n<\/ul>\n<h3>Generational Shenandoah GC (JEP 521)\u00a0<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0443\u0447\u0443 \u043d\u0430 \u043c\u043e\u043b\u043e\u0434\u043e\u0435 \u0438 \u0441\u0442\u0430\u0440\u043e\u0435 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0420\u0430\u043d\u0435\u0435, Shenandoah \u0431\u044b\u043b\u0430 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u0431\u0435\u0437 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439.\u00a0<\/p>\n<h3>\u0415\u0449\u0451: <\/h3>\n<p><strong>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 G1 GC, \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 (JEP 512), \u0433\u0438\u0431\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b (JEP 513) \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435.<\/strong> \u0410 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 JVM \u0441\u0442\u0430\u043b\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0438 \u0443\u043c\u043d\u0435\u0435, \u043b\u0443\u0447\u0448\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u0438\u043c\u0438\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 CPU. \u0414\u043b\u044f Kubernetes \u2013 \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u0432 \u0438 \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u043e\u0431\u043b\u0430\u043a\u0430.<\/p>\n<p>\u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0441\u0431\u043e\u0440\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430 &#8212; \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0435\u043c\u0430. \u041c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h3>\u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a&#8230; Oracle \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442 GraalVM \u0438\u0437 Java Standard Edition.<\/h3>\n<p>\u0427\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442:<\/p>\n<p>GraalVM \u0434\u043b\u044f JDK 24 \u0441\u0442\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u043c \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 Oracle Java SE. \u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 GraalVM JIT \u0442\u0430\u043a\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f OracleJDK. Native Image \u043a\u0430\u043a Early Adopter-\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 Java SE.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 GraalVM \u0434\u043b\u044f Java \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 Project Leyden \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0430, \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f footprint \u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u043e time-to-peak performance.<\/p>\n<p>\u0421\u0430\u043c \u0436\u0435 GraalVM \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u2014 GraalPy, GraalJS \u0438 \u043f\u0440\u043e\u0447\u0438\u0445.<\/p>\n<p><strong>\u041a\u0430\u043a \u0431\u044b\u0442\u044c?<\/strong><\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Graal JIT \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 C2 JIT \u0432 OpenJDK.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0438\u0441\u044c AOT \u2014 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 Java 25: \u0442\u0430\u043c \u0443\u0436\u0435 <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/1niamuc\/detaching_graalvm_from_the_java_ecosystem_train\/\">JEP 514<\/a> (Ahead-of-Time Command-Line Ergonomics) \u0438 <a href=\"https:\/\/openjdk.org\/jeps\/515\">JEP 515<\/a> (Ahead-of-Time Method Profiling).<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 OpenJDK. Tiered \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u043d\u0430 \u043b\u044e\u0431\u043e\u043c OpenJDK \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 temurin), \u0432\u044b \u043f\u043e-\u0434\u0435\u0444\u043e\u043b\u0442\u0443 \u0431\u0443\u0434\u0435\u0442\u0435 \u0431\u0435\u043d\u0435\u0444\u0438\u0442\u0438\u0442\u044c \u043e\u0442 C2.<\/p>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e GraalVM \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041a\u0430\u043a \u0432\u044b\u0441\u043a\u0430\u0437\u0430\u043b\u0441\u044f <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/1niamuc\/detaching_graalvm_from_the_java_ecosystem_train\/\">Thomas Wuerthinger, Project Lead GraalVM \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 Product Manager Java Standard Edition \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043d\u0430 Reddit<\/a> &#8212; GraalVM \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0438 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0443\u0445\u043e\u0434\u0438\u0442. \u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043b\u0438\u0448\u044c \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 GraalVM JIT.<\/p>\n<p>\ud83e\udd73 \u041e\u0442\u043c\u0435\u0447\u0430\u0435\u043c \u0440\u0435\u043b\u0438\u0437 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 Java \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445!<\/p>\n<hr\/>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/258\/484\/92d\/25848492d4cd2dcd1df595e475569a9a.png\" width=\"1560\" height=\"334\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/258\/484\/92d\/25848492d4cd2dcd1df595e475569a9a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/258\/484\/92d\/25848492d4cd2dcd1df595e475569a9a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0430\u00a0Spring Boot \u0432\u00a0\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u00a0\u2014\u00a0<a href=\"https:\/\/t.me\/+oBwACbkvJ19iODAy\">Spring \u0410\u0439\u041e<\/a>, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0442\u044c \u0432 \u043a\u0443\u0440\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u0438\u0437 \u043c\u0438\u0440\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 Spring Boot \u0438 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043e<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/947420\/\">https:\/\/habr.com\/ru\/articles\/947420\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044c \u0432\u0435\u043a\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f\u0437\u044b\u043a, \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u00ab\u0443\u043c\u043d\u044b\u0445 \u0442\u043e\u0441\u0442\u0435\u0440\u043e\u0432\u00bb, \u0441\u0442\u0430\u043b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430 \u0438 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0421\u0435\u0433\u043e\u0434\u043d\u044f Java \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0432\u0441\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u0441\u0442\u0435\u0440\u0435\u043e\u0442\u0438\u043f \u043e \u00ab\u0442\u044f\u0436\u0451\u043b\u043e\u043c \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0434\u0438\u043d\u043e\u0437\u0430\u0432\u0440\u0435\u00bb. \u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0439\u0442\u0435 25 \u0432\u0435\u0440\u0441\u0438\u044e Java \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 Spring \u0410\u0439\u041e!\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0438\u0447\u0438:JEP 520: \u041c\u0435\u0442\u043e\u0434-\u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0438 \u0442\u0430\u0439\u043c\u0438\u043d\u0433 \u0432 JFR \u2014 \u0437\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u0435\u0437 \u043a\u043e\u0434\u0430 \u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432\u0412 Java 25 JFR (Java Flight Recorder) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u2014 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u0431\u0435\u0437 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0431\u0435\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 Java-\u0430\u0433\u0435\u043d\u0442\u043e\u0432.\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e?\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0438\u043b\u0438 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0442\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0411\u0414. \u0420\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c:\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c JFR-\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043a\u043e\u0434\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0430\u0433\u0435\u043d\u0442 \u0447\u0435\u0440\u0435\u0437 -javaagent\u041f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0441 sampling-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u043c\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Spring AOP \u0438 @Around-\u0430\u0441\u043f\u0435\u043a\u0442\u044b\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0449\u0435: \u0442\u043e\u0447\u043d\u043e, \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0438 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439.\u0427\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438?\u0414\u0432\u0430 \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 JFR:jdk.MethodTiming \u2014 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b, \u0437\u0430\u043c\u0435\u0440\u044f\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0435, \u043c\u0438\u043d\/\u043c\u0430\u043a\u0441 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044fjdk.MethodTrace \u2014 \u043f\u0438\u0448\u0435\u0442 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u0430 \u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430\u0418 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435: \u0432\u0441\u0451 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438, \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435!\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0438 \u043a\u0430\u043a \u0434\u043e\u043b\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f HashMap::resize.\u0417\u0430\u043f\u0443\u0441\u043a:java -XX:StartFlightRecording=method-trace=java.util.HashMap::resize,filename=resize.jfr &#8230;\u0410\u043d\u0430\u043b\u0438\u0437:jfr print &#8212;events jdk.MethodTrace resize.jfr\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430:jdk.MethodTrace {startTime = 00:39:26.379duration = 0.00113 msmethod = java.util.HashMap.resize()eventThread = &#171;main&#187;stackTrace = [  java.util.HashMap.putVal(&#8230;)  java.util.HashMap.put(&#8230;)  &#8230;  java2d.J2Ddemo.main(String[]) line: 674  ]}\u041a\u0430\u043a \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?\u0417\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 &lt;clinit&gt; \u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442:-XX:StartFlightRecording:method-timing=::&lt;clinit&gt;,filename=init.jfr\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 @Get \u0438\u0437 JAX-RS:jcmd &lt;pid&gt; JFR.start method-timing=@jakarta.ws.rs.GET\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u043c\u0435\u0442\u043e\u0434:&lt;setting name=&#187;filter&#187;&gt;com.example.Foo::doSomething;com.example.Bar::handle&lt;\/setting&gt;\u041a\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442?\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 .jfr-\u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e:\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0435\u0440\u0435\u0437 jfr print \u0438\u043b\u0438 jfr view\u041f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432 JDK Mission Control\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 JMX\/RemoteRecordingStream\u0412 \u0447\u0451\u043c \u043f\u043e\u043b\u044c\u0437\u0430?\u0411\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b\u0422\u043e\u0447\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 FileDescriptor::close\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u0443, \u0441\u0442\u0430\u043b \u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438\u041e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0431\u0435\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u0434\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u041c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 \u0438\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c -javaagent. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u0438 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.JEP 502: Stable Values502 JEP \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043e\u043d \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u0440\u0438\u043d\u0435\u0441\u0451\u0442 \u0432 Java \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0421 \u044d\u0442\u0438\u043c \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438! \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 HotSpot JIT \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0432\u0451\u0440\u0442\u043a\u0443 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 (constant-folding) \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u043e\u0439 StableValue. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u0442\u0438\u043f\u0430 StableValue \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 (\u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438\u00a0 static final), \u043b\u0438\u0431\u043e \u0435\u0441\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 StableValue \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0439 (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435).\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0434\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043b\u043e\u0433\u0433\u0435\u0440 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c stable \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 JDK 25:public record OrderControllerImpl(Supplier&lt;Logger&gt; logger) implements OrderController {    @Override    public void submitOrder(User user, List&lt;Product&gt; products) {        logger.get().info(&#171;order started&#187;);        \/\/ &#8230;        logger.get().info(&#171;order submitted&#187;);    }    \/**     * {@return a new OrderController}     *\/    public static OrderController create() {        return new OrderControllerImpl(                StableValue.supplier(                        () -&gt; Logger.create(OrderControllerImpl.class)));    }}private static final OrderControler ORDER_CONTROLLER = OrderControllerImpl.create();ORDER_CONTROLLER.submitOrder(&#8230;);\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041f\u0430\u0432\u043b\u0430 \u041a\u0438\u0441\u043b\u043e\u0432\u0430:\u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u0442\u0440\u0430\u0445\u0443\u0435\u0442 \u0432\u0430\u0448 \u043a\u043e\u0434 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 record. \u0412 java \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043a\u0440\u044b\u0442\u044c canonical constuctor \u0432 record, \u043a\u0430\u043a \u0432 scala \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u0432 Dart. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 &#8212; \u044d\u0442\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c &#171;\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c create() \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430&#187;.\u00a0\u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e record \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0443 record final \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. JVM \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043a \u043d\u0438\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f builder-pattern \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u0417\u0434\u0435\u0441\u044c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0440\u044e\u043a, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 logger \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f, \u2014 \u0447\u0435\u0440\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 record. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b record-\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u043c.\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438:\u041a\u043e\u0434 \u0432\u044b\u0448\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c immutable logger, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043b\u0435\u043d\u0438\u0432\u043e, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c JIT \u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0441\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a final \u043f\u043e\u043b\u0435 (\u0412 Java \u0443\u0436\u0435 \u0434\u043e\u043b\u0433\u0438\u0435 \u0433\u043e\u0434\u044b \u0435\u0441\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f @Stable, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u041e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u043b\u0443, \u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435)\u0423 \u043e\u043f\u044b\u0442\u043d\u043e\u0433\u043e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0447\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f logger \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0434\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u0447\u0435\u043c \u0442\u0430\u043a \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u0436\u0438\u0437\u043d\u044c? \u0412\u0435\u0434\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c:public record OrderControllerImpl(Logger logger) implements OrderController {    @Override    public void submitOrder(User user, List&lt;Product&gt; products) {        logger.info(&#171;order started&#187;);        \/\/ &#8230;        logger.info(&#171;order submitted&#187;);    }    \/** {@return a new OrderController} *\/    public static OrderController create() {        return new OrderControllerImpl(Logger.create(OrderControllerImpl.class));    }}\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u043e\u0436\u0435 \u043d\u0435\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0447\u0435\u0440\u0435\u0437 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u0430 \u0438\u0434\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a Logger. \u041d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 logger \u0432 heap \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f eagerly. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e. \u0418\u043d\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u044f\u0436\u0435\u043b\u044b\u0439, \u0438 \u043d\u0435 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u043d \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f. \u0418 \u0435\u0433\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u043d\u0438\u0432\u043e. \u0418 StableValue \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0432\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441 JIT \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u0433\u0434\u0435 \u0412\u044b \u0435\u043c\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435 &#8212; \u0434\u0440\u0443\u0436\u0438\u0449\u0435, \u0441\u043c\u043e\u0442\u0440\u0438, \u044f \u0442\u0435\u0431\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e, \u0447\u0442\u043e \u0442\u0430 \u0441\u0441\u044b\u043b\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u043e\u0434\u044c\u044e\u0441\u0438\u0440\u0443\u0435\u0442 StableValue &#8212; \u043e\u043d\u0430 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0441\u0430\u043c \u0434\u0438\u0437\u0430\u0439\u043d StableValue \u043d\u0435 \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u0435\u0451 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c). \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0444\u043e\u043b\u0434\u0438\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e, \u043c\u043e\u0436\u0435\u0448\u044c \u043c\u043d\u0435 \u0432\u0435\u0440\u0438\u0442\u044c, \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0442\u044b \u0434\u0435\u043b\u0430\u043b\u0430 \u0441 @Stable \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432 JVM. \u0418 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043f\u043e \u0441\u0443\u0442\u0438 \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f. \u0412\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 immutable \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0435 \u0435\u0433\u043e \u043b\u0435\u043d\u0438\u0432\u043e, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u043e\u0442 \u0432 \u0447\u0451\u043c \u0441\u0443\u0442\u044c.\u0412\u043e\u0442 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u044f (non-evicting), \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c API stable \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:private static final Function&lt;Integer, Double&gt; SQRT_CACHE =\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0StableValue.function(ffff, i -&gt; StrictMath.sqrt(i));&#8230;\/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0435\u043d\u0438\u0432\u043e, \u043d\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0432\u0451\u0440\u043d\u0443\u0442\u043e JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c -&gt; 4double sqrt16 = SQRT_CACHE.apply(16);\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 SQRT_CACHE \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 4, \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 sqrt() \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 SQRT_CACHE. \u0418 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u043a\u043e\u0433\u0434\u0430 JIT \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435, \u0442\u043e \u043e\u043d \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0432\u0451\u0440\u0442\u043a\u0443 \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 sqrt(16) \u0438 \u0441\u0445\u043b\u043e\u043f\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 &#8212; 4.\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438:\u0421 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u043e\u0439 Lazy \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u0432\u044b \u0431\u044b \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c JIT-\u0443 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 sqrt() \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u044b\u043b \u0431\u044b final \u043f\u043e\u043b\u0435\u043c, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u043e \u043d\u0438 \u043e \u0447\u0451\u043c \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442. \u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043c\u044b \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0442\u0430\u0442\u044c\u044e \u043e \u0442\u043e\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 final \u043f\u043e\u043b\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f final.\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0437\u0432\u0430\u043b\u0438 Lazy?\u042d\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u044b\u0439 \u0447\u0430\u0441\u0442\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u043e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u00ab\u043b\u0435\u043d\u0438\u0432\u043e\u0433\u043e\u00bb (lazy) \u043f\u043e\u043b\u044f \u2014 \u044d\u0442\u043e \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u00ab\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e\u00bb (stable) \u043f\u043e\u043b\u044f. \u041e\u0431\u0430 \u0442\u0438\u043f\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442 \u043b\u0435\u043d\u0438\u0432\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043e ahead-of-time (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f).\u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 StableValue \u0438 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0435\u0451, \u043a\u0430\u043a \u0432\u0430\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Lazy, \u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:@FunctionalInterfaceinterface Lazy&lt;T&gt; extends Supplier&lt;T&gt; {    static &lt;T&gt; Lazy&lt;T&gt; of(Supplier&lt;? extends T&gt; original) {        return StableValue.supplier(original)::get;    }}private static final Lazy&lt;String&gt; httpResponse = Lazy.of(() -&gt; retrieveHttp(&#8230;));System.out.println(&#171;The response was &#171;+httpResponse.get());\u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b (\u043a\u0430\u043a StableValue.supplier(original)::get \u0432\u044b\u0448\u0435) \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u044b\u0442\u044b\u0445 (hidden) \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0418\u043c \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0442\u0435 \u0436\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u0451\u0440\u0442\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u0447\u0442\u043e \u0438 StableValue.supplier(), \u0438 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430 Spring \u0410\u0439\u041e, \u041c\u0438\u0445\u0430\u0438\u043b\u0430 \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0438:\u0420\u0435\u0447\u044c \u043f\u0440\u043e JEP 371. Hidden \u043a\u043b\u0430\u0441\u0441\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0430\u043c\u0430 JVM \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u0430\u043a \u0432\u043e\u0442 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 method reference \u0432 StableValue.supplier()::get, \u0433\u0434\u0435 VM \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 hidden \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 Lazy\/Supplier \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.JIT \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0445 \u0442\u043e\u0436\u0435 trusted source-\u043e\u043c \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u0440\u043e\u0434\u0443 \u043f\u0440\u0438\u0447\u0438\u043d, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c JEP \u0434\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430.\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e final-\u043f\u043e\u043b\u044f\u0445\u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e JDK \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0434\u043e\u0432\u0435\u0440\u0438\u0435 \u0438 \u043a final-\u043f\u043e\u043b\u044f\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f stable \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u2014 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0451 \u0435\u0449\u0451 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u044f \u0441\u0432\u0451\u0440\u0442\u043a\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d.Scoped Values (JEP 506)\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a\u0438:ScopedValue&lt;String&gt; USER = ScopedValue.newInstance();ScopedValue.where(USER, &#171;admin&#187;).run(() -&gt;\u00a0\u00a0\u00a0\u00a0System.out.println(USER.get()) \/\/&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-475236","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/475236","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=475236"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/475236\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=475236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=475236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=475236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}