{"id":337697,"date":"2022-08-30T21:00:21","date_gmt":"2022-08-30T21:00:21","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=337697"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=337697","title":{"rendered":"<span>\u0413\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 Java Memory Model<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/eb\/nm\/iu\/ebnmiu3gfh1rn74kqsnvqrv2rnm.png\" data-src=\"https:\/\/habrastorage.org\/webt\/eb\/nm\/iu\/ebnmiu3gfh1rn74kqsnvqrv2rnm.png\"\/><\/p>\n<p>  <\/p>\n<p>\u042f \u043f\u0440\u043e\u0432\u0435\u043b \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 JMM \u043c\u043d\u043e\u0433\u043e \u0447\u0430\u0441\u043e\u0432 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u044e\u0441\u044c \u0441 \u0432\u0430\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c Java Memory Model (JMM) \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0414\u0430, \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u0440\u043e JMM\/happens-before, \u0438, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0435\u0437\u0436\u0435\u043d\u043d\u0443\u044e \u0442\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043c\u0438\u043c\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0434\u0430\u0442\u044c \u0432\u0430\u043c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 JMM, \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0430\u0442\u044c \u043e \u0442\u0430\u043a\u0438\u0445 \u0432\u0435\u0449\u0430\u0445 \u043a\u0430\u043a memory ordering, data race \u0438 happens-before. JMM \u2014 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0442\u0435\u043c\u0430 \u0438 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043d\u0435 \u043d\u0430 \u0441\u043b\u043e\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043c\u043e\u0438\u0445 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0446\u0438\u0442\u0430\u0442\u0430\u043c\u0438 \u0438\u0437 \u0441\u043f\u0435\u043a\u0438, \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c \u0438 jcstress \u0442\u0435\u0441\u0442\u0430\u043c\u0438.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"vvedenie-kontekst\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435: \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/h2>\n<p>  <\/p>\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043a\u043e\u0434 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0432 \u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041e\u043d \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430 (\u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, <em>javac<\/em>)<\/li>\n<li>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 (\u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, JIT \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <em>HotSpot C1\/C2<\/em>). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0440\u0435\u0434\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0448\u0438\u0440\u043e\u043a\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0430 \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u043a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Instruction_scheduling\" rel=\"nofollow noopener noreferrer\">Instruction scheduling<\/a><\/li>\n<li>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043c\u0438\u0440\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0448\u0438\u0440\u043e\u043a\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u043a\u0430\u043a <em><a href=\"https:\/\/en.wikipedia.org\/wiki\/Out-of-order_execution\" rel=\"nofollow noopener noreferrer\">Out-of-order execution<\/a><\/em>, <em><a href=\"https:\/\/en.wikipedia.org\/wiki\/Branch_predictor\" rel=\"nofollow noopener noreferrer\">Branch Prediction<\/a> + <a href=\"https:\/\/en.wikipedia.org\/wiki\/Speculative_execution\" rel=\"nofollow noopener noreferrer\">Speculation<\/a><\/em>, <em><a href=\"https:\/\/en.wikipedia.org\/wiki\/Cache_prefetching\" rel=\"nofollow noopener noreferrer\">Prefetching<\/a><\/em>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 \u043a\u0430\u0436\u0434\u043e\u0435 \u044f\u0434\u0440\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0434\u0440\u0430\u043c. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0430 \u043d\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u042d\u0442\u043e \u0432\u0435\u0434\u0435\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f \u0441 \u0446\u0435\u043b\u044c\u044e \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0441\u0430\u043c\u044b\u0439 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043a\u043e\u0434\u0430, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u044d\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u0442 \u043f\u043e\u0437\u0434\u043d\u0435\u0435. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0442\u043e\u044f\u0442 \u0434\u043e\u0440\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u0442\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u0438\u0437\u0431\u0435\u0436\u0430\u0432 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f<\/li>\n<li>\u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0438 \u043a\u044d\u0448\u0430 \u0441\u0442\u043e\u0438\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u0435\u0448\u0435\u0432\u043b\u0435, \u0447\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u044f\u0434\u0440\u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u043b\u0438 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u044d\u0448\u0443, \u0430 \u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043a\u044d\u0448\u0435\u043c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043a\u0430\u043a \u0432 \u0442\u0430\u043a\u043e\u043c \u0445\u0430\u043e\u0441\u0435 \u043c\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443?<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438, \u0438 \u043f\u043b\u043e\u0445\u0438\u0435. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0445\u043e\u0440\u043e\u0448\u0435\u0439:<\/p>\n<p>  <\/p>\n<ol>\n<li>Java \u0434\u0430\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e <em><a href=\"https:\/\/en.wikipedia.org\/wiki\/As-if_rule\" rel=\"nofollow noopener noreferrer\">as-if-serial<\/a><\/em> \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u2014 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 JDK \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u043c \u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0432 \u043a\u043e\u0434\u0435<\/li>\n<li>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0442\u043e\u0436\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/li>\n<li>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0438\u043c\u0435\u044e\u0442 Cache Coherence \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u044d\u0448\u0435\u0439: \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448 \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430, \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u044f\u0434\u0440\u0430\u043c<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u2014 \u044d\u0442\u043e\u0442 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043a\u0430\u043a \u0443\u0433\u043e\u0434\u043d\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u0435\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">a = 5; b = 7; int r1 = a; \/* always 5 *\/ int r2 = b; \/* always 7 *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c?<br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">b = 7; a = 5; int r2 = b; \/* 7 *\/ int r1 = a; \/* 5 *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043b\u0438 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">b = 7; int r2 = b; \/* 7 *\/ a = 5; int r1 = a; \/* 5 *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0442\u043e, \u0447\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443. \u0422\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u0438 2 \u043d\u0430\u0431\u043e\u0440\u0430 \u0438\u0437 \u0437\u0430\u043f\u0438\u0441\u0438\/\u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043b\u043e\u0445\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438:<\/p>\n<p>  <\/p>\n<ol>\n<li>Java \u0434\u0430\u0435\u0442 <em>as-if-serial<\/em> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0434\u0430 \u0432 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 shared \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0442\u0440\u0435\u0434\u0430. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u0440\u0435\u0434\u0430 \u0432 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0432\u0430\u043b\u0438\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 <em>\u0435\u0433\u043e<\/em> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043d\u043e \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 <em>\u0434\u0440\u0443\u0433\u0438\u0435<\/em> \u0442\u0440\u0435\u0434\u044b<\/li>\n<li>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 \u0432 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438<\/li>\n<li>Cache Coherence \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u043e \u043f\u0440\u043e\u043f\u0430\u0433\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e, \u0430 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041e\u0431\u043e \u0432\u0441\u0435\u043c \u044d\u0442\u043e\u043c \u043c\u044b \u0435\u0449\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043a \u0441\u0442\u0430\u0442\u044c\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class MemoryReorderingExample {     private int x;     private int y;      public void T1() {         x = 1;         int r1 = y;     }      public void T2() {         y = 1;         int r2 = x;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443: \u0435\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0442\u0440\u0435\u0434\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c <code>0<\/code> \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 <code>y<\/code>, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>x<\/code> \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0430\u0435\u043c \u0438 \u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0434\u0435: \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u0438\u0434\u0438\u043c <code>0<\/code> \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 <code>x<\/code>, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>y<\/code> \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043c\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043a\u043e\u0433\u0434\u0430 \u0443\u0432\u0438\u0434\u0438\u043c <code>0<\/code> \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u0447\u0442\u0435\u043d\u0438\u044f\u0445. \u041e\u0434\u043d\u0430\u043a\u043e, \u0445\u043e\u0442\u044c \u044d\u0442\u043e \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0442\u0435\u043d\u0438\u044f <code>(r1, r2) = (0, 0)<\/code>. \u0410 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<p>  <\/p>\n<ol>\n<li><em>Instructions reordering<\/em>. \u041e\u0431\u0430 \u0442\u0440\u0435\u0434\u0430 \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b<\/li>\n<li><em>Visibility<\/em>. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u043e, \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0432\u0438\u0434\u043d\u044b \u0438\u0437-\u0437\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u0438 \u043f\u0440\u043e\u043f\u0430\u0433\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u0435\u0448\u0430<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0421\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043d\u0435 \u043d\u0430 \u0441\u043b\u043e\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 <a href=\"https:\/\/github.com\/openjdk\/jcstress\" rel=\"nofollow noopener noreferrer\">jcstress<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c concurrency \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f Java:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@JCStressTest @Description(\"Classic test that demonstrates memory reordering\") @Outcome(id = \"1, 1\", expect = Expect.ACCEPTABLE, desc = \"Have seen both writes\") @Outcome(id = {\"0, 1\", \"1, 0\"}, expect = Expect.ACCEPTABLE, desc = \"Have seen one of the writes\") @Outcome(id = \"0, 0\", expect = Expect.ACCEPTABLE_INTERESTING, desc = \"Have not seen any write\") public class JmmReorderingDekkerTest {      @Actor     public final void actor1(DataHolder dataHolder, II_Result r) {         r.r1 = dataHolder.actor1();     }      @Actor     public final void actor2(DataHolder dataHolder, II_Result r) {         r.r2 = dataHolder.actor2();     }      @State     public static class DataHolder {         private int x;         private int y;          public int actor1() {             x = 1;             return y;         }          public int actor2() {             y = 1;             return x;         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u0435\u0441\u0442\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>(1, 1): Expect.ACCEPTABLE<\/code> \u2014 \u043c\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u043e\u0431\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. \u042d\u0442\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/li>\n<li><code>(0, 1), (1, 0): Expect.ACCEPTABLE<\/code> \u2014 \u043c\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0440\u0430\u043d\u043e. \u042d\u0442\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/li>\n<li><code>(0, 0): Expect.ACCEPTABLE_INTERESTING<\/code> \u2014 \u043c\u044b \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u042d\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439 instructions reordering\/visibility<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442 \u043d\u0430 Intel Core i7-11700 (x86), Windows 10 x64, OpenJDK 17 (\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u043c\u043e\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">RESULT         SAMPLES     FREQ       EXPECT  DESCRIPTION   0, 0   2,188,517,311   18,91%  Interesting  Have not seen any write   0, 1   4,671,980,718   40,36%   Acceptable  Have seen one of the writes   1, 0   4,708,890,866   40,68%   Acceptable  Have seen one of the writes   1, 1       5,569,185    0,05%   Acceptable  Have seen both writes<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0432 18,91% \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043e\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432 \u043c\u044b \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u0421\u0442\u0430\u043b\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e? \u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0434\u0430\u043b\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e.<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"vvedenie-jmm\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435: JMM<\/h2>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438 \u043f\u043e\u043d\u044f\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e JMM.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e as-if-serial \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c as-if-serial \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u043d\u0430 \u0432\u0441\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438 \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430? \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u2014 \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u0440\u0438\u043b\u043e \u0431\u044b \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e \u0438\u0437 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u2014 \u044d\u0442\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043c\u0438\u043a\u0440\u043e-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438\u043b\u0438 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\/JVM. \u041d\u043e \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u0440\u0443\u043f\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u0441\u0440\u0435\u0434\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0447\u0442\u043e \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, ARM \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u0430\u0431\u044b\u043c\u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f\u043c\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 x86: \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u0430\u0433\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0443\u044e \u043d\u0430 x86 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0430 ARM. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043e\u0431\u044b\u0447\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u043d\u0435 \u0434\u0430\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439, \u0430 \u0432\u043e\u043b\u044c\u043d\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 <em>\u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438<\/em> (memory model), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u043f\u043e\u0442\u043e\u043a\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043c\u044f\u0442\u044c (memory ordering). \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, JVM \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043d\u043e \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, JVM \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/li>\n<li>\u0421\u0442\u0440\u043e\u0433\u043e \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439, \u0438 \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c<\/li>\n<li>\u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0438 \u043f\u0430\u043c\u044f\u0442\u044c\u044e<\/li>\n<li>\u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f trade-off \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, Java \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <strong>Java Memory Model<\/strong> (JMM). \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e JMM \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u041e\u0434\u043d\u0430\u043a\u043e <em>\u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439<\/em> \u043d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0432 \u043a\u043e\u0434\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, JMM \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0439 JDK \u0438 \u043c\u0438\u043a\u0440\u043e-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432, \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439.<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"vvedenie-memory-ordering\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435: Memory Ordering<\/h2>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043a\u0430\u043a Memory Ordering.<\/p>\n<p>  <\/p>\n<p><strong>Memory Ordering<\/strong> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 <em>\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439<\/em> \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e.<\/p>\n<p>  <\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435: \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432 \u043a\u043e\u0434\u0435. \u0422\u0430\u043a\u0436\u0435 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0435\u0434\u0438\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u043c \u0442\u0440\u0435\u0434\u0430\u043c. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u0435\u0442 \u043d\u0438 \u043e \u043a\u0430\u043a\u0438\u0445 compiler reordering\/instructions reordering\/caching\/register allocation \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. \u0415\u0441\u043b\u0438 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043c\u044b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043d\u0435 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0442\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e) \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f c \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, <em>\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e (memory order) \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 (program order)<\/em>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0443\u044e \u043d\u0430\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f Memory Ordering:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>Thread 0<\/th>\n<th>Thread 1<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>x = 1<\/td>\n<td>y = 1<\/td>\n<\/tr>\n<tr>\n<td>r1 = y<\/td>\n<td>r2 = x<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <code>(r1, r2) = (0, 0)<\/code> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e <em>\u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b <code>StoreLoad<\/code> memory reordering<\/em>, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0434\u043e \u0437\u0430\u043f\u0438\u0441\u0438. \u041d\u0435 \u0432\u0430\u0436\u043d\u043e, \u043f\u043e \u043a\u0430\u043a\u043e\u0439 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u044d\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0430 \u0432\u0430\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0442\u043e, \u0447\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0431\u044b\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0432 \u043d\u0435\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u0438 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043d\u0430\u043c \u043b\u0438\u0448\u044c \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441:<\/p>\n<p>  <\/p>\n<ol>\n<li><strong>\u041a\u0430\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e?<\/strong> \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0442\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f<\/li>\n<li><strong>\u0412\u0430\u043b\u0438\u0434\u0435\u043d \u043b\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u044b\u0439 memory order?<\/strong> \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0442\u043e memory order, \u043d\u0435\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0441 program order, \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0414\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, <em>Memory Reordering<\/em> \u2014 \u044d\u0442\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u0438 \u043e\u0431\u043e\u0431\u0449\u0430\u0435\u0442 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u0432\u044b\u0448\u0435. \u0412\u0441\u0435\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 4 \u0442\u0438\u043f\u0430 memory reordering:<\/p>\n<p>  <\/p>\n<ol>\n<li><em>LoadLoad<\/em>: \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0447\u0442\u0435\u043d\u0438\u0439 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0447\u0442\u0435\u043d\u0438\u044f\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>r1, r2<\/code> \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 <code>r2, r1<\/code><\/li>\n<li><em>LoadStore<\/em>: \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0447\u0442\u0435\u043d\u0438\u0439 \u0441 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438, \u0438\u0434\u0443\u0449\u0438\u043c\u0438 \u043f\u043e\u0437\u0436\u0435 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>r, w<\/code> \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 <code>w, r<\/code><\/li>\n<li><em>StoreStore<\/em>: \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>w1, w2<\/code> \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 <code>w2, w1<\/code><\/li>\n<li><em>StoreLoad<\/em>: \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441 \u0447\u0442\u0435\u043d\u0438\u044f\u043c\u0438, \u0438\u0434\u0443\u0449\u0438\u043c\u0438 \u043f\u043e\u0437\u0436\u0435 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>w, r<\/code> \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 <code>r, w<\/code><\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u044f \u0431\u0443\u0434\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c &#171;\u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435&#187; \u0438\u043b\u0438 &#171;reordering&#187;, \u044f \u0431\u0443\u0434\u0443 \u0438\u043c\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0443 \u0438\u043c\u0435\u043d\u043d\u043e Memory Reordering, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435.<\/p>\n<p>  <\/p>\n<p><em>Memory Model<\/em> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0438\u0434\u044b:<\/p>\n<p>  <\/p>\n<ol>\n<li><em>Sequential Consistency<\/em>: \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f<\/li>\n<li><em>Relaxed Consistency<\/em>: \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f<\/li>\n<li><em>Weak Consistency<\/em>: \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u044f\u0437\u044b\u043a\u0430, \u0442\u0430\u043a \u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043d\u043e \u043e\u043d\u0438 \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u041c\u043e\u0434\u0435\u043b\u044c \u044f\u0437\u044b\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u0430\u0431\u044b\u0435, \u0442\u0430\u043a \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, Java Memory Model \u043d\u0435 \u0434\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u0418 \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0433\u043b\u0430\u0432\u0443 Memory Ordering \u0438\u0437 <a href=\"https:\/\/www.intel.com\/content\/dam\/www\/public\/us\/en\/documents\/manuals\/64-ia-32-architectures-software-developer-system-programming-manual-325384.pdf#G13.14501\" rel=\"nofollow noopener noreferrer\">Intel Software Developer\u2019s Manual<\/a>:<\/p>\n<p>  <\/p>\n<blockquote>\n<ul>\n<li>Reads are not reordered with other reads [\u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 LoadLoad reordering]<\/li>\n<li>Writes are not reordered with older reads [\u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 LoadStore reordering]<\/li>\n<li>Writes to memory are not reordered with other writes [\u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 StoreStore reordering]<\/li>\n<li>Reads may be reordered with older writes to different locations but not with older writes to the same location [\u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 StoreLoad reordering]<\/li>\n<\/ul>\n<p>  <\/p><\/blockquote>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, Intel \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <code>StoreLoad<\/code> \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f, \u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b. \u0414\u0430, \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 x86 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0440\u043e\u0433\u0430, \u043d\u043e \u0435\u0441\u0442\u044c \u0438 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u0430\u0431\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, ARM \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0438\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043f\u043e\u0434 x86, \u0432\u0430\u043c \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u0441 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u0430\u0431\u043e\u0439 Java Memory Model, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. <em>\u041c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u044f\u0437\u044b\u043a\u0430 \u2014 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e.<\/em><\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h3 id=\"instructions-ordering-vs-memory-ordering\">Instructions Ordering vs Memory Ordering<\/h3>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u0440\u0430\u0437 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043c: Instructions Ordering \u0438 Memory Ordering \u2014 \u044d\u0442\u043e \u043d\u0435 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043a\u0430\u043a \u0443\u0433\u043e\u0434\u043d\u043e, \u043d\u043e \u0438\u0445 <em>memory effect<\/em> \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c Memory Ordering \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f (\u0438\u043b\u0438 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f) Memory Model. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, <em>memory ordering<\/em> \u2014 \u044d\u0442\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Intel \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 <code>LoadLoad<\/code> \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043f\u0435\u043a\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u044b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f. \u041a\u0430\u043a \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u043b memory ordering \u043f\u0440\u0430\u0432\u0438\u043b. \u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0442\u0435\u043d\u0438\u044f \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 <a href=\"https:\/\/www.intel.com\/content\/dam\/www\/public\/us\/en\/documents\/manuals\/64-ia-32-architectures-software-developer-system-programming-manual-325384.pdf#G13.31870\" rel=\"nofollow noopener noreferrer\">Intel Software Developer\u2019s Manual<\/a>:<\/p>\n<p>  <\/p>\n<blockquote><p>The processor-ordering model described in this section is virtually identical to that used by the Pentium and Intel486 processors. The only enhancements in the Pentium 4, Intel Xeon, and P6 family processors are:  <\/p>\n<ul>\n<li>Added support for speculative reads, while still adhering to the ordering principles above.<\/li>\n<\/ul>\n<p>  <\/p><\/blockquote>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"vvedenie-data-race\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435: data race<\/h2>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 Memory Reordering, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c \u2014 <em>data race<\/em>. \u0413\u043e\u043d\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0441 shared \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u0432\u0430 \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0435\u0434\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u043f\u0438\u0448\u0435\u0442 \u0438 \u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432 \u0441\u043f\u0435\u043a\u0435:<\/p>\n<p>  <\/p>\n<ol>\n<li><a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se17\/html\/jls-17.html#jls-17.4.1\" rel=\"nofollow noopener noreferrer\">JLS \u00a717.4.1. Shared Variables<\/a>:<br \/> <br \/>\n<blockquote><p>Memory that can be shared between threads is called <em>shared memory<\/em> or <em>heap memory<\/em>.<\/p>\n<p>  All instance fields, <code>static<\/code> fields, and array elements are stored in heap memory. In this chapter, we use the term <em>variable<\/em> to refer to both fields and array elements.<\/p>\n<p>  Two accesses to (reads of or writes to) the same variable are said to be <em>conflicting<\/em> if at least one of the accesses is a write.  <\/p><\/blockquote>\n<\/li>\n<li><a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se17\/html\/jls-17.html#jls-17.4.5\" rel=\"nofollow noopener noreferrer\">JLS \u00a717.4.5. Happens-before Order<\/a>:<br \/> <br \/>\n<blockquote><p>When a program contains two conflicting accesses (\u00a717.4.1) that are not ordered by a happens-before relationship, it is said to contain a <em>data race<\/em>.  <\/p><\/blockquote>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0433\u043e\u043d\u043a\u0435 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 (\u043f\u043e\u0440\u044f\u0434\u043a\u0430) \u2014 \u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0436\u0435 \u043d\u0430\u043c \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u0437\u0430 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u0441\u043d\u043e\u0432\u0430 \u043a \u0441\u043f\u0435\u043a\u0435 \u2014 <a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se17\/html\/jls-17.html#jls-17.4.3\" rel=\"nofollow noopener noreferrer\">JLS \u00a717.4.3. Programs and Program Order<\/a>:<\/p>\n<p>  <\/p>\n<blockquote><p>A set of actions is <em>sequentially consistent<\/em> if all actions occur in a total order (the execution order) that is consistent with program order, and furthermore, each read r of a variable v sees the value written by the write w to v such that:  <\/p>\n<ul>\n<li>w comes before r in the execution order, and<\/li>\n<li>there is no other write w&#8217; such that w comes before w&#8217; and w&#8217; comes before r in the execution order.<br \/>  Sequential consistency is a very strong guarantee that is made about visibility and ordering in an execution of a program. Within a sequentially consistent execution, there is a total order over all individual actions (such as reads and writes) which is consistent with the order of the program, and each individual action is atomic and is immediately visible to every thread.<\/li>\n<\/ul>\n<p>  <strong>If a program has no data races, then all executions of the program will appear to be sequentially consistent.<\/strong><\/p><\/blockquote>\n<p>\u0422\u0430\u0430\u043a, <em>sequential consistency<\/em>, \u0433\u0434\u0435-\u0442\u043e \u043c\u044b \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043b\u044b\u0448\u0430\u043b\u0438\u2026 \u0410\u0445 \u0434\u0430, SC \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 Memory Reordering! \u042d\u0442\u043e \u0437\u0432\u0443\u0447\u0438\u0442 \u043a\u0430\u043a \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e. \u0418\u0434\u0435\u043c \u0434\u0430\u043b\u0435\u0435: \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f sequential consistency, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0432\u0441\u0435\u0445 data race \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u0417\u0432\u0443\u0447\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, JMM \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 data race \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0435 <em>happens-before<\/em>. \u0410 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 happens-before.<\/p>\n<p>  <\/p>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436, \u043f\u043e\u0435\u0445\u0430\u043b\u0438!<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"jmm-happens-before\">JMM: Happens-before<\/h2>\n<p>  <\/p>\n<p><strong>Happens-Before<\/strong> \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 memory ordering, \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0432 \u043a\u043e\u0434\u0435. \u0418\u0437 \u0441\u043f\u0435\u043a\u0438 (<a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se17\/html\/jls-17.html#jls-17.4.5\" rel=\"nofollow noopener noreferrer\">\u00a717.4.5. Happens-before Order<\/a>):<\/p>\n<p>  <\/p>\n<blockquote><p>Two actions can be ordered by a <em>happens-before<\/em> relationship. If one action <em>happens-before<\/em> another, then the first is visible to and ordered before the second.<\/p><\/blockquote>\n<p>Happens-before \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0443\u0441\u0442\u044c \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a <code>T1<\/code> \u0438 \u043f\u043e\u0442\u043e\u043a <code>T2<\/code> (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0442 \u043f\u043e\u0442\u043e\u043a\u0430 <code>T1<\/code>), \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>x<\/code> \u0438 <code>y<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0432 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 <code>T1<\/code> \u0438 <code>T2<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e<\/li>\n<li>\u0415\u0441\u043b\u0438 <code>x<\/code> happens-before <code>y<\/code>, \u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>y<\/code> \u0442\u0440\u0435\u0434\u0443 <code>T2<\/code> \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u043d\u044b \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0432 <code>x<\/code> \u0442\u0440\u0435\u0434\u043e\u043c <code>T1<\/code><\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u0432\u044f\u0436\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a shared \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e happens-before, \u0442\u043e \u043c\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 data race, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u0438 \u043e\u0442 memory reordering.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u044f\u0441\u043d\u0438\u043c \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442: \u043d\u0435\u0442, happens-before \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443, \u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e. JLS:<\/p>\n<p>  <\/p>\n<blockquote><p>It should be noted that the presence of a happens-before relationship between two actions does not necessarily imply that they have to take place in that order in an implementation. If the reordering produces results consistent with a legal execution, it is not illegal.<\/p><\/blockquote>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 JMM \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 happens-before.<\/p>\n<p>  <\/p>\n<h3 id=\"happens-before-same-thread-actions\">[Happens-Before] Same thread actions<\/h3>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <code>x<\/code> \u0438\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434 <code>y<\/code> \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u0442\u0440\u0435\u0434\u0435, \u0442\u043e <code>x<\/code> <em>happens-before<\/em> <code>y<\/code>:<\/p>\n<p>  <\/p>\n<blockquote><p>If <code>x<\/code> and <code>y<\/code> are actions of the same thread and <code>x<\/code> comes before <code>y<\/code> in program order, then <code>hb(x, y)<\/code>.<\/p><\/blockquote>\n<p>\u042d\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 as-if-serial \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438: \u0435\u0441\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <code>A<\/code> \u0438\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c <code>B<\/code> \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u043e <code>B<\/code> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0443\u0432\u0438\u0434\u0438\u0442 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0432 <code>A<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u0440\u0430\u0437 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043c: happens-before \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0440\u0435\u0434 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>Thread 0<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>x = 1<\/td>\n<\/tr>\n<tr>\n<td>r1 = y<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0435\u0434\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <code>x = 1<\/code> happens-before <code>r1 = y<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b: \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>x<\/code> \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 <code>y<\/code>. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438 <code>y<\/code> \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 <code>x<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b, \u0442\u043e happens-before \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>Thread 0&#8242;<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>x = 1<\/td>\n<\/tr>\n<tr>\n<td>y = x + 1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0412 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u2014 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 <code>y<\/code> \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>x<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 happens-before \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044f, \u0447\u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 <code>y<\/code> \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 <code>x<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"happens-before-monitor-lock\">[Happens-Before] Monitor lock<\/h3>\n<p>  <\/p>\n<p>\u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430 <em>happens-before<\/em> \u043a\u0430\u0436\u0434\u044b\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0437\u0430\u0445\u0432\u0430\u0442\u043e\u043c \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430.<\/p>\n<p>  <\/p>\n<blockquote><p>An unlock action on monitor <code>m<\/code> <em>happens-before<\/em> all subsequent lock actions on <code>m<\/code><\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"happens-before-volatile\">[Happens-Before] Volatile<\/h3>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 <code>volatile<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em>happens-before<\/em> \u043a\u0430\u0436\u0434\u044b\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0439 \u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.<\/p>\n<p>  <\/p>\n<blockquote><p>A write to a volatile variable <code>v<\/code> happens-before all subsequent reads of <code>v<\/code> by any thread<\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"happens-before-final-thread-action\">[Happens-Before] Final thread action<\/h3>\n<p>  <\/p>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u0442\u0440\u0435\u0434\u0435 T1 <em>happens-before<\/em> \u043b\u044e\u0431\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u0432 \u0442\u0440\u0435\u0434\u0435 T2, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0440\u0435\u0434 T1 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d.<\/p>\n<p>  <\/p>\n<blockquote><p>The final action in a thread <code>T1<\/code> <em>happens-before<\/em> any action in another thread <code>T2<\/code> that detects that <code>T1<\/code> has terminated.<\/p><\/blockquote>\n<p>\u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u043a \u0442\u0430\u043a\u0438\u043c happens-before:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 <code>T1<\/code> <em>happens-before<\/em> \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0430 <code>T1.join()<\/code> \u0432 <code>T2<\/code><\/li>\n<li>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 <code>T1<\/code> <em>happens-before<\/em> \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0430 <code>T1.isAlive()<\/code> \u0432 <code>T2<\/code> (\u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>false<\/code>)<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"happens-before-thread-start-action\">[Happens-before] Thread start action<\/h3>\n<p>  <\/p>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0440\u0435\u0434\u0430 (<code>Thread.start()<\/code>) <em>happens-before<\/em> \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0442\u0440\u0435\u0434\u0435.<\/p>\n<p>  <\/p>\n<blockquote><p>An action that starts a thread <em>happens-before<\/em> the first action in the thread it starts.<\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"happens-before-thread-interrupt-action\">[Happens-before] Thread interrupt action<\/h3>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0434 <code>T1<\/code> \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0435\u0434 <code>T2<\/code>, \u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0440\u0430\u043f\u0442 <em>happens-before<\/em> \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0440\u0430\u043f\u0442\u0430. \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0440\u0430\u043f\u0442 \u043c\u043e\u0436\u043d\u043e \u0438\u043b\u0438 \u043f\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e <code>InterruptedException<\/code>, \u0438\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430 <code>Thread.interrupted<\/code>\/<code>Thread.isInterrupted<\/code>.<\/p>\n<p>  <\/p>\n<blockquote><p>If thread <code>T1<\/code> interrupts thread <code>T2<\/code>, the interrupt by <code>T1<\/code> <em>happens-before<\/em> any point where any other thread (including <code>T2<\/code>) determines that <code>T2<\/code> has been interrupted (by having an <code>InterruptedException<\/code> thrown or by invoking <code>Thread.interrupted<\/code> or <code>Thread.isInterrupted<\/code>).<\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"happens-before-default-initialization\">[Happens-Before] Default initialization<\/h3>\n<p>  <\/p>\n<p>\u0414\u0435\u0444\u043e\u043b\u0442\u043d\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f (<code>0<\/code>, <code>false<\/code> \u0438\u043b\u0438 <code>null<\/code>) \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em>happens-before<\/em> \u043b\u044e\u0431\u044b\u043c\u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u0432 \u0442\u0440\u0435\u0434\u0435.<\/p>\n<p>  <\/p>\n<blockquote><p>The write of the default value (<code>zero<\/code>, <code>false<\/code>, or <code>null<\/code>) to each variable <em>happens-before<\/em> the first action in every thread.<\/p>\n<p>  Although it may seem a little strange to write a default value to a variable before the object containing the variable is allocated, conceptually every object is created at the start of the program with its default initialized values.<\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"happens-before-transitivity\">Happens-before transitivity<\/h3>\n<p>  <\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 <em>happens-before<\/em> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <em>\u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u043c<\/em>. \u0422\u043e \u0435\u0441\u0442\u044c, \u0435\u0441\u043b\u0438 <code>hb(x,y)<\/code> \u0438 <code>hb(y,z)<\/code>, \u0442\u043e <code>hb(x,z)<\/code>.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e\u043c\u0443 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044e. \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u0442\u0440\u0435\u0434\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <em>happens-before<\/em> (same thread actions). \u0422\u043e\u0433\u0434\u0430 \u0435\u0441\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <code>A<\/code> \u0432 \u043e\u0434\u043d\u043e\u043c \u0442\u0440\u0435\u0434\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c <em>happens-before<\/em> \u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c <code>B<\/code> \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0442\u0440\u0435\u0434\u0435, \u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u0442\u0440\u0435\u0434\u0443 <em>\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>B<\/code><\/em> \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u043d\u044b \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0432\u044b\u043c \u0442\u0440\u0435\u0434\u043e\u043c <em>\u0434\u043e \u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>A<\/code><\/em>.<\/p>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u0440\u0430\u0437: \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>[A1, A2]<\/code> \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0442\u0440\u0435\u0434\u0435, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>[B1, B2]<\/code> \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0434\u0435, \u0438 <code>hb(A2, B1)<\/code>, <em>\u0442\u043e<\/em> <code>hb(A1, B1)<\/code>, <code>hb(A1, B2)<\/code> \u0438 <code>hb(A2, B2)<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0414\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0442\u0440\u0435\u0434\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f happens-before: <code>hb(A1, A2)<\/code>, <code>hb(B1, B2)<\/code><\/li>\n<li>happens-before \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u0435\u043d: \u0435\u0441\u043b\u0438 <code>hb(A1, A2)<\/code> (same thread), <code>hb(A2, B1)<\/code> (hb), <code>hb(B1, B2)<\/code> (same thread), <em>\u0442\u043e<\/em> <code>hb(A1, B1)<\/code>, <code>hb(A1, B2)<\/code> \u0438 <code>hb(A2, B2)<\/code><\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430, \u043d\u043e \u0438 \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u043d\u044b \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0442\u0440\u0435\u0434\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430<\/li>\n<li>\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 volatile \u043f\u043e\u043b\u0435, \u043d\u043e \u0438 \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u043d\u044b \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0442\u0440\u0435\u0434\u0443 \u043f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u043b\u044f<\/li>\n<li>\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043d\u043e \u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0442\u0440\u0435\u0434\u0430 T1 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u043d\u044b \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0442\u0440\u0435\u0434\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f <code>T1.join()<\/code><\/li>\n<li>\u2026 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u2014 \u0438\u0434\u0435\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 happens-before:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0443\u0441\u0442\u044c \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a <code>T1<\/code> \u0438 \u043f\u043e\u0442\u043e\u043a <code>T2<\/code> (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0442 \u043f\u043e\u0442\u043e\u043a\u0430 <code>T1<\/code>), \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>x<\/code> \u0438 <code>y<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 <code>T1<\/code> \u0438 <code>T2<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e<\/li>\n<li>\u0415\u0441\u043b\u0438 <code>x<\/code> happens-before <code>y<\/code>, \u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>y<\/code> \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u043d\u044b \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0434\u043e \u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>x<\/code><\/li>\n<\/ol>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"happens-before-practice\">Happens-before: Practice<\/h2>\n<p>  <\/p>\n<p>\u041c\u044b \u0443\u0436\u0435 \u043d\u0430 \u043f\u043e\u043b\u043f\u0443\u0442\u0438 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043d\u0435\u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class MemoryReorderingExample {     private int x;     private boolean initialized = false;      public void writer() {         x = 5; \/* W1 *\/         initialized = true; \/* W2 *\/     }      public void reader() {         boolean r1 = initialized; \/* R1 *\/         if (r1) {             int r2 = x; \/* R2, may read default value (0) *\/         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>true<\/code> \u043d\u0430 <code>R1<\/code>, \u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>5<\/code> \u043d\u0430 <code>R2<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>x<\/code> \u0438\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 <code>initialized<\/code>. \u041d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (<code>0<\/code>) \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 <code>x<\/code> \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<p>  <\/p>\n<ol>\n<li><em>Instructions reordering (1\/2)<\/em> \u2014 \u0437\u0430\u043f\u0438\u0441\u0438 W1 \u0438 W2 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043c\u0435\u0441\u0442\u0430\u043c\u0438<\/li>\n<li><em>Instructions reordering (2\/2)<\/em> \u2014 \u0447\u0442\u0435\u043d\u0438\u044f R1 \u0438 R2 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043c\u0435\u0441\u0442\u0430\u043c\u0438<\/li>\n<li><em>Visibility<\/em> \u2014 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>x<\/code> \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0434\u0440\u0430\u043c \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0447\u0442\u0435\u043d\u0438\u044f<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b <code>StoreStore<\/code> \u0438\u043b\u0438 <code>LoadLoad<\/code> memory reordering.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043b\u0438\u0447\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 jcstress \u0442\u0435\u0441\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@JCStressTest @Description(\"Triggers memory reordering\") @Outcome(id = \"-1\", expect = Expect.ACCEPTABLE, desc = \"Not initialized yet\") @Outcome(id = \"5\", expect = Expect.ACCEPTABLE, desc = \"Returned correct value\") @Outcome(id = \"0\", expect = Expect.ACCEPTABLE_INTERESTING, desc = \"Initialized but returned default value\") public class JmmReorderingPlainTest {      @Actor     public final void actor1(DataHolder dataHolder) {         dataHolder.writer();     }      @Actor     public final void actor2(DataHolder dataHolder, I_Result r) {         r.r1 = dataHolder.reader();     }      @State     public static class DataHolder {         private int x;         private boolean initialized = false;          public void writer() {             x = 5;             initialized = true;         }          public int reader() {             if (initialized) {                 return x;             }             return -1; \/\/ return mock value if not initialized         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442 \u043d\u0430 Intel Core i7-11700 (x86), Windows 10 x64, OpenJDK 17 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Results across all configurations:  RESULT        SAMPLES     FREQ       EXPECT  DESCRIPTION     -1  5,004,050,680   38,73%   Acceptable  Not initialized yet      0        168,651   &lt;0,01%  Interesting  Initialized but returned default value      5  7,916,756,029   61,27%   Acceptable  Returned correct value<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0432 &lt;0,01% \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u0435\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u0439 Memory Order.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0434\u043e\u0432\u0435\u0434\u0435\u043c \u044d\u0442\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f happens-before.<\/p>\n<p>  <\/p>\n<h3 id=\"monitor-lock\">Monitor lock<\/h3>\n<p>  <\/p>\n<p><a href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/essential\/concurrency\/locksync.html\" rel=\"nofollow noopener noreferrer\">Monitor lock<\/a> (Intrinsic lock) \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 happens-before \u043c\u0435\u0436\u0434\u0443 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u0438 \u0432\u0437\u044f\u0442\u0438\u0435\u043c \u043b\u043e\u043a\u0430, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81\" rel=\"nofollow noopener noreferrer\">\u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u043c<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 (\u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u0441\u0435\u043a\u0446\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 shared \u0434\u0430\u043d\u043d\u044b\u043c\u0438). \u041a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 Java \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u0442\u0430\u043a\u043e\u0439 \u043b\u043e\u043a (\u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <em>intrinsic<\/em>), \u043d\u043e \u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c keyword <code>synchronized<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class SynchronizedHappensBefore {     private final Object lock = new Object();      private int x;     private boolean initialized = false;      public void writer() {         synchronized (lock) {             x = 5; \/* W1 *\/             initialized = true; \/* W2 *\/         } \/* RELEASE *\/     }      public synchronized void reader() {         synchronized (lock) { \/* ACQUIRE *\/             boolean r1 = initialized; \/* R1 *\/             if (r1) {                 int r2 = x; \/* R2, guaranteed to see 5 *\/             }         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>lock<\/code>, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e happens-before \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430 <code>reader<\/code> \u0443\u0432\u0438\u0434\u0438\u0442 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0434\u0435\u043b\u0430\u043b <code>writer<\/code> \u0434\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430. \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u0435\u0441\u043b\u0438 <code>hb(W1, W2)<\/code> (same thread), <code>hb(W2, RELEASE)<\/code> (same thread), <code>hb(RELEASE, ACQUIRE)<\/code> (monitor lock), <code>hb(ACQUIRE, R1)<\/code> (same thread), <code>hb(R1, R2)<\/code> (same thread), <em>\u0442\u043e <code>hb(W2, R1)<\/code> \u0438 <code>hb(W1, R2)<\/code> (transitivity)<\/em>.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 <code>writer<\/code> \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u043b \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u0438 \u043c\u044b \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u043b\u0438 \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u0432 <code>reader<\/code>, \u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f happens-before \u043d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h3 id=\"volatile\">Volatile<\/h3>\n<p>  <\/p>\n<p><em>Volatile<\/em> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 happens-before \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0438 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0438\u0437 <code>volatile<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u0421\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 volatile \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 exclusive access.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>volatile<\/code> \u043c\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class VolatileHappensBefore {      private int x;     private volatile boolean initialized;      public void writer() {         x = 5; \/* W1 *\/         initialized = true; \/* W2 *\/     }      public void reader() {         boolean r1 = initialized; \/* R1 *\/         if (r1) {             int r2 = x; \/* R2, guaranteed to see 5 *\/         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 <code>volatile<\/code> \u043f\u043e\u043b\u0435 <code>initialized<\/code>, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e happens-before \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0434\u0435\u043b\u0430\u043b <code>writer<\/code> \u0434\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 <code>volatile<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e. \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u0435\u0441\u043b\u0438 <code>hb(W1, W2)<\/code> (same thread), <code>hb(W2, R1)<\/code> (volatile), <code>hb(R1, R2)<\/code> (same thread), <em>\u0442\u043e <code>hb(W1, R2)<\/code> (transitivity)<\/em>.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 <code>true<\/code> \u043d\u0430 <code>R1<\/code>, \u0442\u043e \u043d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 <code>volatile<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f happens-before \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u042d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043e\u0442 data race \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f Memory Ordering \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"cache-coherence\">Cache Coherence<\/h2>\n<p>  <\/p>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0443\u0436\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u043b \u0442\u0435\u043c\u0443 Cache Coherence, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0432 \u043d\u0435\u0439 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u0438\u0434\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u044d\u0448\u0430 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u044d\u0448. \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0445\u043e\u0447\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u043e \u043e\u043d \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u044d\u0448. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u043c \u043d\u0435\u0442, \u0442\u043e \u043a\u044d\u0448 \u0441\u0430\u043c \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u0435\u043d \u0437\u0430 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0432 \u043a\u044d\u0448\u0435. \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0445\u043e\u0447\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0442\u043e \u043e\u043d \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u044d\u0448, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u0435\u043d \u0437\u0430 \u0441\u0431\u0440\u043e\u0441 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c<\/li>\n<li>\u041a\u044d\u0448 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 &#171;\u043b\u0438\u043d\u0438\u0439&#187; (cache line) \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043b\u0430\u0434\u0443\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438. \u0420\u0430\u0437\u043c\u0435\u0440 \u043b\u0438\u043d\u0438\u0439 \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442 16 \u0434\u043e 256 \u0431\u0430\u0439\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041a\u044d\u0448 \u0441\u0430\u043c \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u043c\u0430\u043f\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043b\u0438\u043d\u0438\u0438 \u043a\u044d\u0448\u0430 \u0432 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438<\/li>\n<li>\u041a\u044d\u0448 \u0438\u043c\u0435\u0435\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u044d\u0448\u0430 64 KB, \u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043b\u0438\u043d\u0438\u0438 \u043a\u044d\u0448\u0430 64 \u0431\u0430\u0439\u0442, \u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043a\u044d\u0448 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c 1024 \u043b\u0438\u043d\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u0430 \u0432 \u043a\u044d\u0448\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u0442\u043e \u0438\u0437 \u043a\u044d\u0448\u0430 \u0432\u044b\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/li>\n<li>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cache_hierarchy\" rel=\"nofollow noopener noreferrer\">\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043a\u044d\u0448\u0430<\/a>: \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e L1, L2, \u0438 L3. \u0412\u0435\u0440\u0445\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u043a\u044d\u0448\u0430 (L1, L2) \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u2014 \u043a\u0430\u0436\u0434\u043e\u0435 \u044f\u0434\u0440\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0434\u0435\u0440 \u043a\u044d\u0448. \u041a\u044d\u0448 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 (L3) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u043c \u0438 \u0448\u0430\u0440\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u044f\u0434\u0440\u0430\u043c\u0438<br \/> \n<ol>\n<li>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0443\u0440\u043e\u0432\u043d\u044e \u043a\u044d\u0448\u0430 \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0440\u043e\u0436\u0435, \u0447\u0435\u043c \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0441\u0442\u0443\u043f \u043a L1 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u043e\u0438\u0442\u044c 3 \u0446\u0438\u043a\u043b\u0430, L2 \u2014 12 \u0446\u0438\u043a\u043b\u043e\u0432, \u0430 \u043a L3 \u2014 38 \u0446\u0438\u043a\u043b\u043e\u0432<\/li>\n<li>\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u044d\u0448 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, \u0447\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, L1 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 80 KB, L2 \u2014 1.25 MB, \u0430 L3 \u2014 24 MB<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044f\u0434\u0440\u0430 \u0438\u043c\u0435\u044e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0443\u0441\u0442\u044c \u0434\u0432\u0430 \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0432 \u0441\u0432\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448. \u0417\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u0435 \u044f\u0434\u0440\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0432\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448, \u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0435 \u044f\u0434\u0440\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041a\u0430\u043a \u0438\u0442\u043e\u0433, \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u044d\u0448\u0435\u0439 \u043d\u0435 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b. \u0415\u0441\u043b\u0438 \u0431\u044b \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0449\u0438\u0439 \u043a\u044d\u0448, \u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e \u0431\u044b: \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u044d\u0448, \u0430 \u043d\u0435 \u0438\u0434\u0443\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0442\u043e \u043e\u0431\u0449\u0438\u0439 \u043a\u044d\u0448 \u043f\u043e \u0441\u0443\u0442\u0438 \u0431\u044b\u043b \u0431\u044b master \u043a\u043e\u043f\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0433\u0434\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043b\u0435\u0436\u0430\u043b\u0438 \u0431\u044b \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u043e \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u0440\u0438\u043b\u043e \u0431\u044b \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u044d\u0448 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0446\u0438\u043a\u043b \u0435\u0434\u0438\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u043b\u0438 \u0431\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448 \u0440\u0430\u0441\u043f\u0430\u044f\u043d \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u043b\u0438\u0436\u0435 \u043a \u044f\u0434\u0440\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u0434\u0435\u0448\u0435\u0432\u043b\u0435. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u043e\u0435 \u044f\u0434\u0440\u043e \u043c\u043e\u0433\u043b\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043a\u044d\u0448\u0435\u043c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0434\u0435\u0440.<\/p>\n<p>  <img decoding=\"async\" alt=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u044d\u0448\u0430\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/at\/pw\/m2\/atpwm2vnpon_q-28tuwueoltb7s.jpeg\" height=\"80%\" width=\"80%\" data-src=\"https:\/\/habrastorage.org\/webt\/at\/pw\/m2\/atpwm2vnpon_q-28tuwueoltb7s.jpeg\" data-blurred=\"true\"\/>  <\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0443\u043c\u0435\u044e\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u044d\u0448\u0435\u0439 \u0442\u0430\u043a, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0435 \u0438\u0437 \u044f\u0434\u0435\u0440 \u0432\u0441\u0435\u0433\u0434\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  <\/p>\n<p><strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Cache_coherence\" rel=\"nofollow noopener noreferrer\">Cache Coherence<\/a><\/strong> (\u043a\u043e\u0433\u0435\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u044d\u0448\u0430) \u2014 \u044d\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0435 \u044f\u0434\u0440\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0430\u043c\u043e\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u044d\u0448\u0430. \u0414\u0430\u043d\u043d\u044b\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0432 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u0421\u0430\u043c\u044b\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0438\u0437 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u2014 \u044d\u0442\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/MESI_protocol\" rel=\"nofollow noopener noreferrer\">MESI<\/a> \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Intel \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/MESIF_protocol\" rel=\"nofollow noopener noreferrer\">MESIF<\/a>, \u0430 AMD \u2014 <a href=\"https:\/\/en.wikipedia.org\/wiki\/MOESI_protocol\" rel=\"nofollow noopener noreferrer\">MOESI<\/a> \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b.<\/p>\n<p>  <\/p>\n<p>\u0412 MESI \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439:<\/p>\n<p>  <\/p>\n<ol>\n<li><em><strong>I<\/strong>nvalid<\/em> \u2014 \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0430 (\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437 \u043d\u0435\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0447\u0438\u0442\u0430\u0442\u044c<\/li>\n<li><em><strong>S<\/strong>hared<\/em> \u2014 \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u0438 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u0438. \u041a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u044d\u0448, \u0442\u043e \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432 shared \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 \u0442\u0430\u043a\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u043a\u044d\u0448\u0430, \u043d\u043e \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0434\u0435\u0440 \u0447\u0438\u0442\u0430\u044e\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u043e \u044d\u0442\u0430 \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u043f\u043b\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u044d\u0448\u0435\u0439, \u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 &#171;shared&#187;<\/li>\n<li><em><strong>E<\/strong>xclusive<\/em> \u2014 \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u0438 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043b\u0438\u043d\u0438\u044e \u043a\u044d\u0448\u0430 \u0432 \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u0438\u043a\u0430\u043a\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u044f\u0434\u0440\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u044d\u0442\u0443 \u043b\u0438\u043d\u0438\u044e \u043a\u044d\u0448\u0430 \u0443 \u0441\u0435\u0431\u044f, \u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 &#171;exclusive&#187;. \u0415\u0441\u043b\u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043b\u0438\u043d\u0438\u044e \u043a\u044d\u0448\u0430 \u0432 <em>exclusive<\/em> \u0441\u0442\u0435\u0439\u0442, \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044f\u0434\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043a\u043e\u043f\u0438\u044e \u043a\u0430\u043a <em>invalid<\/em><\/li>\n<li><em><strong>M<\/strong>odified<\/em> \u2014 \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0431\u044b\u043b\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430 (dirty), \u0442\u043e \u0435\u0441\u0442\u044c \u044f\u0434\u0440\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u043e \u0432 \u043d\u0435\u0435 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 exclusive \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043d\u0435\u0435. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e \u043a\u044d\u0448\u0430 \u0432 Modified \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u0415\u0441\u043b\u0438 \u043b\u0438\u043d\u0438\u044f \u0432\u044b\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u044d\u0448\u0430, \u0442\u043e \u043a\u044d\u0448 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u0435\u043d \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u043e\u0439<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043e\u0434\u043d\u043e \u0438\u0437 \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0445\u043e\u0447\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043b\u0438\u043d\u0438\u044e \u043a\u044d\u0448\u0430, \u0442\u043e \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c exclusive \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f\u0434\u0440\u043e \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u044f\u0434\u0440\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e \u043a\u044d\u0448\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u043a\u0430\u043a invalid \u0432 \u0438\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u044d\u0448\u0435. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044f\u0434\u0440\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u043c\u0435\u0442\u0438\u0432 \u0441\u0432\u043e\u044e \u043a\u043e\u043f\u0438\u044e \u043a\u0430\u043a invalid, \u044f\u0434\u0440\u043e \u0441\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u044d\u0442\u0438\u043c \u043f\u043e\u043c\u0435\u0447\u0430\u044f \u043b\u0438\u043d\u0438\u044e \u043a\u044d\u0448\u0430 \u043a\u0430\u043a modified. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u044f\u0434\u0440\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u044d\u0448\u0435, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0435\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043b\u044e\u0431\u043e\u0435 \u044f\u0434\u0440\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0430\u0434\u0440\u0435\u0441 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u042f\u0434\u0440\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 L1 \u043a\u044d\u0448 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0442\u0430\u043c \u0438\u0441\u043a\u043e\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Shared, Exclusive \u0438\u043b\u0438 Modified, \u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0435\u0435 \u0447\u0442\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u044d\u0448\u0435 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e (\u0438\u043b\u0438 \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Invalid), \u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b (local) &#171;cache miss&#187;<\/li>\n<li>\u041f\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0449\u0435\u0439 \u0448\u0438\u043d\u0435 \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u044f\u0434\u0440\u0430\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044f\u0434\u0440\u0430 \u0432\u0438\u0434\u044f\u0442 \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0438 \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u044f\u0434\u0435\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0441\u043a\u043e\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 Shared, Exclusive \u0438\u043b\u0438 Modified, \u0442\u043e \u043e\u043d\u043e \u043e\u0442\u0434\u0430\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043e\u0442\u0432\u0435\u0442.<br \/> \n<ul>\n<li>\u0415\u0441\u043b\u0438 \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0431\u044b\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0432 Modified \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043e\u0442\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u043b\u0438\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 Shared \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/li>\n<\/ul>\n<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043d\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u044d\u0448\u0435\u0439, \u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438<\/li>\n<li>\u0412\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0433\u0434\u0435 \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0447\u0438\u0442\u0430\u044e\u0449\u0435\u0435 \u044f\u0434\u0440\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0432\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448, \u043f\u043e\u043c\u0435\u0447\u0430\u044f \u043b\u0438\u043d\u0438\u044e \u043a\u044d\u0448\u0430 \u043a\u0430\u043a shared<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u044d\u0448\u0430 \u2014 \u044f \u043e\u043f\u0443\u0441\u0442\u0438\u043b \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0438, \u043d\u043e \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0432\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u0430. \u0421\u043a\u0430\u0436\u0443 \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e \u044f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e \u043d\u0430 \u043f\u043e\u043b\u043d\u0443\u044e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0448\u0435\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e: \u0433\u0434\u0435-\u0442\u043e \u044f \u043c\u043e\u0433 \u0438 \u0441\u043e\u0432\u0440\u0430\u0442\u044c, \u0438\u0431\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u043c \u0432 \u0442\u0430\u043a\u043e\u0439 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u0442\u0435\u043c\u0435 \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043c\u043d\u043e\u0433\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043c\u0438\u043a\u0440\u043e\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e Cache Coherence \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438, \u0433\u0434\u0435 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u043a\u044d\u0448\u0430.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448, \u043e\u043d\u043e <em>\u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0434\u0440\u0430\u043c<\/em>.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0443 \u0432\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u0442\u0430\u043a \u0447\u0442\u043e \u0436\u0435, \u0437\u043d\u0430\u0447\u0438\u0442 visibility \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442? \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043d\u0435 \u0432\u0441\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>  <\/p>\n<h3 id=\"invalidation-queue\">Invalidation Queue<\/h3>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f\u0434\u0440\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u044d\u0448\u0435, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043d\u0435 \u0441\u0440\u0430\u0437\u0443, \u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c <em>Invalidation Queue<\/em> (IQ). \u042d\u0442\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c: \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044f\u0434\u0440\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043d\u044f\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439, \u0438 \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u044f\u0434\u0440\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0432\u0441\u0435 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e invalidate \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0440\u0438\u0441\u043a\u0443\u0435\u043c \u043d\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 invalidation queue \u0435\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d, \u0430 \u0432 \u043a\u044d\u0448\u0435 \u043b\u0435\u0436\u0430\u043b\u043e \u0435\u0449\u0435 \u043d\u0435 \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435, \u043d\u043e \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>CORE 0<\/th>\n<th>CORE 1<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Cached (shared): x(5)<\/td>\n<td>Cached (shared): x(5)<\/td>\n<\/tr>\n<tr>\n<td>send invalidate request<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>accept invalidate request, put in IQ and respond with acknowledgement<\/td>\n<\/tr>\n<tr>\n<td>Cached (exclusive): x(5)<\/td>\n<td>Cached (shared): x(5)<\/td>\n<\/tr>\n<tr>\n<td>x = 10<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>r = x \/<em> 5 <\/em>\/<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>handle invalidate request \/<em> too late! <\/em>\/<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043c\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0445\u043e\u0442\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 invalidate \u0443\u0436\u0435 \u043f\u0440\u0438\u0448\u0435\u043b.<\/p>\n<p>  <\/p>\n<h3 id=\"store-buffer\">Store Buffer<\/h3>\n<p>  <\/p>\n<p>\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u0438\u043a\u0440\u043e-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u0445 (\u043a\u0430\u043a x86) \u043a\u0430\u0436\u0434\u043e\u0435 \u044f\u0434\u0440\u043e \u0438\u043c\u0435\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 FIFO <em>Store Buffer<\/em> (SB, write buffer), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u043b\u043e\u0439\u043a\u043e\u0439 \u043c\u0435\u0436\u0434\u0443 CPU \u0438 \u043a\u044d\u0448\u0435\u043c. \u0412 \u044d\u0442\u043e\u0442 \u0431\u0443\u0444\u0435\u0440 \u044f\u0434\u0440\u043e \u043a\u043b\u0430\u0434\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0442\u0430\u043c \u0441\u0431\u0440\u043e\u0441\u0430 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044f\u0434\u0440\u0430 \u043d\u0435 \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u044e\u0442 \u044d\u0442\u0443 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0441\u0432\u043e\u0435\u043c \u043a\u044d\u0448\u0435 \u0438 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u044e\u0442 acknowledgement. \u042d\u0442\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0438\u0448\u0443\u0449\u0435\u0433\u043e \u044f\u0434\u0440\u0430, \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044f\u0434\u0440\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e. \u041f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u044f\u0434\u0440\u043e \u0441\u043f\u0435\u0440\u0432\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432 \u0441\u0432\u043e\u0439 SB \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0438\u0434\u0442\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c as-if-serial \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u044f\u0434\u0440\u0430 \u043d\u0435 \u0443\u0432\u0438\u0434\u044f\u0442 \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u043e\u043a\u0430 \u043f\u0438\u0448\u0443\u0449\u0435\u0435 \u044f\u0434\u0440\u043e \u043d\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0437 SB \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448, \u0442\u0430\u043a \u043a\u0430\u043a SB \u2014 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u044f\u0434\u0440\u0430, \u043d\u043e \u043d\u0435 \u043a\u044d\u0448\u0430. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, Cache Coherence \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 Store Buffer. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0438\u0448\u0443\u0449\u0435\u0435 \u044f\u0434\u0440\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043d\u043e \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u2014 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>CORE 0<\/th>\n<th>CORE 1<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Cached (exclusive): x(0)<\/td>\n<td>Cached: none<\/td>\n<\/tr>\n<tr>\n<td>x = 5 \/<em> put in SB <\/em>\/<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>r2 = x \/<em> 5, read from SB <\/em>\/<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>r1 = x \/<em> 0 <\/em>\/<\/td>\n<\/tr>\n<tr>\n<td>flushed from sb to cache<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>r3 = x \/<em> 5, read from local cache <\/em>\/<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, CORE 0 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u043b\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>x<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c CORE 1 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e. \u041e\u0434\u043d\u0430\u043a\u043e CORE 1 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u0438 \u0432 \u043a\u044d\u0448\u0435 CORE 0, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u0441\u0435 \u0435\u0449\u0435 \u043b\u0435\u0436\u0438\u0442 \u0432 Store Buffer. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, CORE 1 \u0443\u0432\u0438\u0434\u0438\u0442 <code>0<\/code> \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438 <code>r1<\/code>, \u0445\u043e\u0442\u044f CORE 0 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u0430 <code>r2<\/code>, \u0447\u0435\u043c \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u044f\u0434\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0438\u0434\u044f\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e <em>\u043a\u0440\u043e\u043c\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438<\/em>. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f <em>eventual visibility<\/em> \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u043e\u043b\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u044d\u0448\u0430:<\/p>\n<p>  <img decoding=\"async\" alt=\"\u041f\u043e\u043b\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u044d\u0448\u0430\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/qc\/z4\/nm\/qcz4nmuu6fp2z-f2wv623dfn_fc.jpeg\" width=\"80%\" height=\"80%\" data-src=\"https:\/\/habrastorage.org\/webt\/qc\/z4\/nm\/qcz4nmuu6fp2z-f2wv623dfn_fc.jpeg\" data-blurred=\"true\"\/>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"eventual-visibility\">Eventual Visibility<\/h2>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043d\u0430\u0438\u0432\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f Cache Coherence \u043d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f eventual visibility \u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 Java \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438 \u0447\u0442\u0435\u043d\u0438\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 happens-before). \u041e\u0434\u043d\u0430\u043a\u043e, \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0430\u0432\u0434\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u044f\u0437\u044b\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0442\u0430\u043a, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0438\u0434\u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0442\u0440\u0435\u0434\u0443. \u042f\u0440\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 busy wait, \u0433\u0434\u0435 \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 shared \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.<\/p>\n<p>  <\/p>\n<p>JCStress \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0442\u0435\u0441\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u2014 <a href=\"https:\/\/github.com\/openjdk\/jcstress\/blob\/83365e01e6606f8368a74b3e5503361f51074cde\/jcstress-samples\/src\/main\/java\/org\/openjdk\/jcstress\/samples\/jmm\/basic\/BasicJMM_04_Progress.java#L41\" rel=\"nofollow noopener noreferrer\">BasicJMM_04_Progress#PlainSpin<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@JCStressTest(Mode.Termination) @Outcome(id = \"TERMINATED\", expect = ACCEPTABLE,             desc = \"Gracefully finished\") @Outcome(id = \"STALE\",      expect = ACCEPTABLE_INTERESTING, desc = \"Test is stuck\") @State public static class PlainSpin {     boolean ready;      @Actor     public void actor1() {         while (!ready); \/\/ spin     }      @Signal     public void signal() {         ready = true;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">      RESULT  SAMPLES     FREQ       EXPECT  DESCRIPTION        STALE        4   50.00%  Interesting  Test is stuck   TERMINATED        4   50.00%   Acceptable  Gracefully finished<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0432 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0440\u0435\u0434 \u0437\u0430\u0432\u0438\u0441 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043f\u043e \u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u0446\u0438\u043a\u043b <code>while (!ready)<\/code> \u0432 <code>while(true)<\/code>. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043d \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0438 \u0434\u043e, \u043d\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c happens-before \u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0440\u0435\u0434\u0430\u0445.<\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0442\u0438\u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u0430\u043a <code>volatile<\/code> \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f eventual visibility \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u043e\u043a\u0430 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f\u043c\u0438, \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c happens-before, \u043d\u0430\u043c \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0440\u0435\u0434\u043e\u0432.<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"memory-barriers\">Memory Barriers<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043c\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. \u0425\u043e\u0442\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043d\u043e \u044d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 \u0432 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u044f\u0434\u0440\u0430. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432\u0441\u0435 \u0435\u0449\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043e\u0431\u0441\u0443\u0434\u0438\u043b\u0438 \u0432\u044b\u0448\u0435. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 JMM \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u0430 \u0438 \u0437\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0432\u0435\u0434\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c happens-before.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c Java \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c &#171;memory barrier&#187;, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0430\u043c\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c. \u0417\u0430\u0434\u0430\u0447\u0430 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u2014 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c (memory) \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 <code>volatile<\/code>\/<code>synchronized<\/code> \u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u043c \u043a\u043e\u0434\u0435, \u0441\u0430\u043c\u0430 Java \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0442\u043e\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p><strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Memory_barrier\" rel=\"nofollow noopener noreferrer\">Memory barrier<\/a><\/strong> (memory fence, \u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438) \u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c memory ordering \u0434\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e.<\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u0435\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 4 \u0442\u0438\u043f\u0430 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u2014 \u043e\u043d\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043c\u0430\u0442\u0447\u0430\u0442\u0441\u044f \u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 memory reordering \u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u044e\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445:<\/p>\n<p>  <\/p>\n<ol>\n<li><em>LoadLoad<\/em><br \/> \n<ul>\n<li>\u0434\u0430\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e, \u0447\u0442\u043e \u0432\u0441\u0435 load \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434 load \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u0430<\/li>\n<\/ul>\n<\/li>\n<li><em>LoadStore<\/em><br \/> \n<ul>\n<li>\u0434\u0430\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e, \u0447\u0442\u043e \u0432\u0441\u0435 load \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434 store \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u0430<\/li>\n<\/ul>\n<\/li>\n<li><em>StoreStore<\/em><br \/> \n<ul>\n<li>\u0434\u0430\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e, \u0447\u0442\u043e \u0432\u0441\u0435 store \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434 store \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0441\u0435 store \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u0431\u0443\u0434\u0443\u0442 \u0442\u043e\u0436\u0435 \u0432\u0438\u0434\u043d\u044b, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0438\u0434\u043d\u0430 \u043b\u044e\u0431\u0430\u044f store \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u0430<\/li>\n<\/ul>\n<\/li>\n<li><em>StoreLoad<\/em><br \/> \n<ul>\n<li>\u0434\u0430\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e, \u0447\u0442\u043e \u0432\u0441\u0435 store \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434 load \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0441\u0435 store \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u0441\u0442\u0430\u043d\u0443\u0442 \u0432\u0438\u0434\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0434\u0440\u0430\u043c \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043b\u044e\u0431\u0430\u044f load \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u0430<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0422\u043e, \u043a\u0430\u043a \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u2014 \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Store Buffer\/Invalidation Queue, \u043d\u043e \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u0442\u043e\u0447\u043d\u043e\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0437\u043d\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u2014 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u044b\u0441\u043b\u0438\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 Memory Ordering \u0438 \u0442\u0435\u0445 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u044e\u0442 \u043d\u0430\u043c \u0431\u0430\u0440\u044c\u0435\u0440\u044b.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f 1-\u0432-1 \u0432 \u044d\u0442\u0438 \u0442\u0438\u043f\u044b, \u0438\u043b\u0438 \u0436\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u043e\u0432 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432. \u0412\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 full memory barrier \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432, \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u044f Memory Reordering \u043a\u0430\u043a load, \u0442\u0430\u043a \u0438 store \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432\u043e\u043a\u0440\u0443\u0433 \u0431\u0430\u0440\u044c\u0435\u0440\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 x86 \u043c\u044b \u0438\u043c\u0435\u0435\u043c <a href=\"https:\/\/www.felixcloutier.com\/x86\/mfence\" rel=\"nofollow noopener noreferrer\">mfence<\/a> \u0438 <a href=\"https:\/\/www.felixcloutier.com\/x86\/lock\" rel=\"nofollow noopener noreferrer\">lock prefix<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f full memory barrier. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0448\u0435\u0432\u044b\u0435, \u0433\u0440\u0430\u043d\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e Load- \u0438 Store- \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u0440\u0435: Store \u0431\u0430\u0440\u044c\u0435\u0440 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u043d\u044b \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u044f\u0434\u0440\u0443, \u0430 Load \u0431\u0430\u0440\u044c\u0435\u0440 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043d\u0430\u043c \u043f\u043e \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044e \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0430\u0440\u044c\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>Thread 0<\/th>\n<th>Thread 1<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>x = 1<\/td>\n<td>y = 1<\/td>\n<\/tr>\n<tr>\n<td>[StoreLoad]<\/td>\n<td>[StoreLoad]<\/td>\n<\/tr>\n<tr>\n<td>r1 = y<\/td>\n<td>r2 = x<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c <code>StoreLoad<\/code> \u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c store \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u0441 load \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u0430. \u0412 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0431\u044b\u0442\u044c \u0442\u043e\u0447\u043d\u043e \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 <code>(r1, r2) = (0, 0)<\/code>. \u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b Java, \u0442\u043e \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0431\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a <code>volatile<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043b\u0438\u0447\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c Java \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <code>volatile<\/code>. \u0412 <a href=\"https:\/\/gee.cs.oswego.edu\/dl\/jmm\/cookbook.html\" rel=\"nofollow noopener noreferrer\">JSR-133 Cookbook<\/a>, \u043d\u0435\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0433\u0430\u0439\u0434\u043b\u0430\u0439\u043d\u0435 \u043f\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 JMM \u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u0441\u0442\u0432\u043e\u043c Doug Lea, \u0441\u043a\u0430\u0437\u0430\u043d\u043e:<\/p>\n<p>  <\/p>\n<blockquote>\n<ol>\n<li>Issue a <code>StoreStore<\/code> barrier before each volatile store.<\/li>\n<li>Issue a <code>StoreLoad<\/code> barrier after each volatile store.<\/li>\n<li>Issue <code>LoadLoad<\/code> and <code>LoadStore<\/code> barriers after each volatile load.<\/li>\n<\/ol>\n<p>  <\/p><\/blockquote>\n<p>\u041f\u0443\u0441\u0442\u044c \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>volatile<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class VolatileMemoryBarrierJIT {      private static int field1;     private volatile static int field2;      private static void write(int i) {         field1 = i &lt;&lt; 1;         \/* StoreStore *\/         field2 = i &lt;&lt; 2;          \/* StoreLoad *\/     }      private static void read() {         int r1 = field2;         \/* LoadLoad + LoadStore *\/         int r2 = field1;     }      public static void main(String[] args) throws Exception {         \/\/ invoke JIT         for (int i = 0; i &lt; 10000; i++) {             write(i);             read();         }         Thread.sleep(1000);     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 <a href=\"https:\/\/blogs.oracle.com\/javamagazine\/post\/java-hotspot-hsdis-disassembler\" rel=\"nofollow noopener noreferrer\">hsdis<\/a> \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 (\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043c\u043e\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438). \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u043d\u0430 Intel Core i7-11700 (x86), Windows 10 x64, OpenJDK 17. \u0412\u043e\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 ASM \u043a\u043e\u0434 \u0434\u043b\u044f <code>write()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">[Verified Entry Point]   # {method} {0x00000175a1400310} 'write' '(I)V' in 'jit_disassembly\/VolatileMemoryBarrierJIT'   # parm0:    rdx       = int   #           [sp+0x40]  (sp of caller)   0x000001758817dae3:   mov    DWORD PTR [rsi+0x70],edi     ;*putstatic field1 {reexecute=0 rethrow=0 return_oop=0}                                                             ; - jit_disassembly.VolatileMemoryBarrierJIT::write@3 (line 9)   0x000001758817dae6:   shl    edx,0x2   0x000001758817dae9:   mov    DWORD PTR [rsi+0x74],edx   0x000001758817daec:   lock add DWORD PTR [rsp-0x40],0x0   ;*putstatic field2 {reexecute=0 rethrow=0 return_oop=0}                                                             ; - jit_disassembly.VolatileMemoryBarrierJIT::write@9 (line 10)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 <code>mov<\/code> \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u0445 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 <code>field1<\/code>\/<code>field2<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>lock add DWORD PTR [rsp-0x40],0x0<\/code>. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c <code>0<\/code> \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043d\u0430 \u0441\u0442\u0435\u043a\u0435 (<code>rsp<\/code>), \u043d\u043e \u044d\u0442\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043b\u0438\u0448\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0435\u0448\u0435\u0432\u043e\u0439 \u043f\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 &#171;\u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438&#187;. \u0412\u0441\u0435 \u0434\u0435\u043b\u043e \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 <code>lock<\/code> \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f full memory barrier \u043d\u0430 x86, \u0447\u0442\u043e \u0438 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c <code>StoreLoad<\/code> \u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 <code>volatile<\/code>. JVM \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>mfence<\/code> \u0431\u0430\u0440\u044c\u0435\u0440, \u043d\u043e \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 <code>lock add<\/code> \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c 0 \u043d\u0430 \u0441\u0442\u0435\u043a <a href=\"https:\/\/web.archive.org\/web\/20110620202202\/https:\/\/blogs.oracle.com\/dave\/entry\/instruction_selection_for_volatile_fences\" rel=\"nofollow noopener noreferrer\">\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0443 \u0432\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a \u0432\u043e\u043f\u0440\u043e\u0441: \u0433\u0434\u0435 \u0436\u0435 <code>StoreStore<\/code> \u0431\u0430\u0440\u044c\u0435\u0440? \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u043e \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438, x86 \u0434\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u044b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430. \u0418\u0437 <a href=\"https:\/\/www.intel.com\/content\/dam\/www\/public\/us\/en\/documents\/manuals\/64-ia-32-architectures-software-developer-system-programming-manual-325384.pdf#G13.14501\" rel=\"nofollow noopener noreferrer\">Intel Software Developer&#8217;s Manual<\/a>:<\/p>\n<p>  <\/p>\n<blockquote>\n<ul>\n<li>Reads are not reordered with other reads [\u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 LoadLoad reordering]<\/li>\n<li>Writes are not reordered with older reads [\u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 LoadStore reordering]<\/li>\n<li>Writes to memory are not reordered with other writes [\u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 StoreStore reordering]<\/li>\n<li>Reads may be reordered with older writes to different locations but not with older writes to the same location [\u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 StoreLoad reordering]<\/li>\n<\/ul>\n<p>  <\/p><\/blockquote>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>LoadLoad<\/code>, <code>LoadStore<\/code>, \u0438 <code>StoreStore<\/code> \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043d\u0430 x86 \u043c\u0438\u043a\u0440\u043e\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u0430 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e <code>StoreLoad<\/code> \u0431\u0430\u0440\u044c\u0435\u0440. JVM \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043c\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0443\u0436\u0435 \u0434\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u0432 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043a\u043e\u0434\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 ASM \u043a\u043e\u0434 \u0434\u043b\u044f <code>read()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">[Verified Entry Point]   # {method} {0x00000175a14003a8} 'read' '()V' in 'jit_disassembly\/VolatileMemoryBarrierJIT'   #           [sp+0x40]  (sp of caller)   0x000001758817de5e:   mov    edi,DWORD PTR [rsi+0x74]     ;*getstatic field2 {reexecute=0 rethrow=0 return_oop=0}                                                             ; - jit_disassembly.VolatileMemoryBarrierJIT::read@0 (line 14)   0x000001758817de61:   mov    esi,DWORD PTR [rsi+0x70]     ;*getstatic field1 {reexecute=0 rethrow=0 return_oop=0}                                                             ; - jit_disassembly.VolatileMemoryBarrierJIT::read@4 (line 15)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u044b <code>LoadLoad<\/code> \u0438 <code>LoadStore<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 <code>volatile<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0442\u0440\u043e\u0433\u0438\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f\u043c x86 \u043c\u0438\u043a\u0440\u043e\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u0430\u0431\u043e\u0439 \u043c\u0438\u043a\u0440\u043e\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043a\u0430\u043a ARM \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u0432 \u044d\u0442\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 (\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <a href=\"https:\/\/github.com\/blinky-z\/JmmArticleHabr\/blob\/main\/disassembly\/arm64\/volatile_jit_asm_arm64.txt\" rel=\"nofollow noopener noreferrer\">volatile_jit_asm_arm64.txt<\/a>).<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"happens-before-recap\">Happens-before: Recap<\/h2>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 happens-before \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u0443\u0440\u043e\u0432\u043d\u0435\u0439:<\/p>\n<p>  <\/p>\n<ol>\n<li>Compiler memory ordering<br \/> \n<ol>\n<li>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430 (<code>javac<\/code>)<br \/> \n<ul>\n<li>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 bytecode \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0435\u043d \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435<\/li>\n<\/ul>\n<\/li>\n<li>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 (<code>HotSpot JIT Compiler C1\/C2<\/code>)<br \/> \n<ul>\n<li>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0435\u043d \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li>CPU memory ordering<br \/> \n<ul>\n<li>\u0420\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043d\u0443\u0436\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b Memory Ordering \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0431\u044b\u043b \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0435\u043d \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442 \u0441\u0430\u043c\u043e\u0439 Java \u2014 \u0438\u043c\u0435\u043d\u043d\u0430 \u043e\u043d\u0430 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u043f\u043e\u0440\u044f\u0434\u043a\u0430. \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0436\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 Java, \u043d\u043e \u0438 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"jmm-atomicity\">JMM: Atomicity<\/h2>\n<p>  <\/p>\n<p>\u0412\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c JMM, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043d\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0440\u0430\u043d\u0435\u0435, \u044d\u0442\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0427\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 <em>reference \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/em> (\u0441\u0441\u044b\u043b\u043e\u043a) \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c\u0438<\/li>\n<li>\u0427\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 <em>\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432<\/em> (\u043a\u0440\u043e\u043c\u0435 long\/double) \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c\u0438<\/li>\n<li>\u0427\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 <em>long\/double \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/em>, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u043a <code>volatile<\/code>, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 \u043d\u0430\u043c \u0434\u0430\u044e\u0442 \u044d\u0442\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435? \u041d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438 shared \u0447\u0442\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (<code>0<\/code>, <code>false<\/code>, <code>null<\/code>), \u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0435 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u043d\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0438\u0448\u0443\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0435\u0434\u043e\u0432, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445, \u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u0447\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u043f\u0435\u0440\u0432\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0431\u0438\u0442\u043e\u0432 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e atomicity <em>\u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442 happens-before<\/em>: happens-before \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0430 atomicity \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0438\u043f\u044b \u0432 \u044f\u0437\u044b\u043a\u0435 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 (\u0432 \u0431\u0438\u0442\u0430\u0445) \u0431\u043e\u043b\u044c\u0448\u0438\u0439, \u0447\u0435\u043c \u0434\u043b\u0438\u043d\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Word_(computer_architecture)\" rel=\"nofollow noopener noreferrer\">\u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430<\/a> \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 32-\u0445 \u0431\u0438\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043f\u043e 32 \u0431\u0438\u0442\u0430, \u043d\u043e \u0442\u0438\u043f long\/double \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 64 \u0431\u0438\u0442\u0430. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044f\u0437\u044b\u043a\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c 2 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e 32 \u0431\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0418\u0437 JLS <a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se17\/html\/jls-17.html#jls-17.7\" rel=\"nofollow noopener noreferrer\">\u00a717.7. Non-Atomic Treatment of double and long<\/a>:<\/p>\n<p>  <\/p>\n<blockquote><p>For the purposes of the Java programming language memory model, a single write to a non-volatile <code>long<\/code> or <code>double<\/code> value is treated as two separate writes: one to each 32-bit half. This can result in a situation where a thread sees the first 32 bits of a 64-bit value from one write, and the second 32 bits from another write.<\/p>\n<p>  Writes and reads of volatile <code>long<\/code> and <code>double<\/code> values are always atomic.<\/p>\n<p>  Writes to and reads of references are always atomic, regardless of whether they are implemented as 32-bit or 64-bit values.<\/p><\/blockquote>\n<p>JCStress \u0438\u043c\u0435\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0442\u0435\u0441\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u2014 <a href=\"https:\/\/github.com\/openjdk\/jcstress\/blob\/fa0af79c39b010128f61cb7945149681721ce320\/jcstress-samples\/src\/main\/java\/org\/openjdk\/jcstress\/samples\/jmm\/basic\/BasicJMM_02_AccessAtomicity.java#L77\" rel=\"nofollow noopener noreferrer\">BasicJMM_02_AccessAtomicity.java<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@JCStressTest @Outcome(id = \"0\",  expect = ACCEPTABLE,             desc = \"Seeing the default value: writer had not acted yet.\") @Outcome(id = \"-1\", expect = ACCEPTABLE,             desc = \"Seeing the full value.\") @Outcome(           expect = ACCEPTABLE_INTERESTING, desc = \"Other cases are violating access atomicity, but allowed under JLS.\") @Ref(\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se8\/html\/jls-17.html#jls-17.7\") @State public static class Longs {     long v;      @Actor     public void writer() {         v = 0xFFFFFFFF_FFFFFFFFL;     }      @Actor     public void reader(J_Result r) {         r.r1 = v;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u0430 \u043e\u0442\u0442\u0443\u0434\u0430 \u0436\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">This test would yield interesting results on some 32-bit VMs, for example x86_32:        RESULT        SAMPLES     FREQ       EXPECT  DESCRIPTION            -1  8,818,463,884   70.12%   Acceptable  Seeing the full value.   -4294967296      9,586,556    0.08%  Interesting  Other cases are violating access atomicity, but allowed u...             0  3,747,652,022   29.80%   Acceptable  Seeing the default value: writer had not acted yet.    4294967295         86,082   &lt;0.01%  Interesting  Other cases are violating access atomicity, but allowed u...<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u043d\u0435\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0440\u044f\u043c\u043e \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u2014 <code>writer<\/code> \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0435\u0440\u0432\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0431\u0438\u0442\u043e\u0432, \u043d\u043e \u0435\u0449\u0435 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u043b\u044f long\/double \u2014 \u044d\u0442\u043e \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u0430\u043a <code>volatile<\/code>. \u0414\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u2014 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 <code>synchronized<\/code> \u0431\u043b\u043e\u043a\u0430. \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u044d\u0442\u0438 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0448\u0430\u0440\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0442\u0440\u0435\u0434\u0430\u043c\u0438 \u2014 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u044d\u0442\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430.<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"jmm-final-fields\">JMM: final fields<\/h2>\n<p>  <\/p>\n<p>JMM \u0434\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043b\u044f <code>final<\/code> \u043f\u043e\u043b\u0435\u0439: \u0435\u0441\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u0443\u0442\u0435\u043a\u043b\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 (\u0442\u0430\u043a, \u0447\u0442\u043e \u0435\u0435 \u043c\u043e\u0433 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0440\u0435\u0434), \u0442\u043e \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0432\u0438\u0434\u0435\u043b\u0438 non-null \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, <em>\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u044e\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 <code>final<\/code> \u043f\u043e\u043b\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/em> \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0431\u044b\u043b\u0430 \u0433\u043e\u043d\u043a\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u0418\u0437 \u0441\u043f\u0435\u043a\u0438 JLS <a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se17\/html\/jls-17.html#jls-17.5\" rel=\"nofollow noopener noreferrer\">\u00a717.5. final Field Semantics<\/a>:<\/p>\n<p>  <\/p>\n<blockquote><p>An object is considered to be <em>completely initialized<\/em> when its constructor finishes. A thread that can only see a reference to an object after that object has been completely initialized is guaranteed to see the correctly initialized values for that object&#8217;s <code>final<\/code> fields.<\/p>\n<p>  The usage model for <code>final<\/code> fields is a simple one: Set the <code>final<\/code> fields for an object in that object&#8217;s constructor; and do not write a reference to the object being constructed in a place where another thread can see it before the object&#8217;s constructor is finished. If this is followed, then when the object is seen by another thread, that thread will always see the correctly constructed version of that object&#8217;s <code>final<\/code> fields.<\/p><\/blockquote>\n<p>\u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u0430\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0441 \u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c memory reordering \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u044d\u0442\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>StoreStore<\/code> + <code>LoadLoad<\/code> \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438 \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 <a href=\"https:\/\/gee.cs.oswego.edu\/dl\/jmm\/cookbook.html\" rel=\"nofollow noopener noreferrer\">JSR-133 Cookbook<\/a>:<\/p>\n<p>  <\/p>\n<blockquote>\n<ol>\n<li>Issue a <code>StoreStore<\/code> barrier after all stores but before return from any constructor for any class with a final field.<\/li>\n<li>If on a processor that does not intrinsically provide ordering on indirect loads, issue a <code>LoadLoad<\/code> barrier before each load of a final field.<\/li>\n<\/ol>\n<p>  <\/p><\/blockquote>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u043e\u0442 \u0442\u0430\u043a JVM \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 <code>final<\/code> \u043f\u043e\u043b\u044f\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Object _obj = &lt;new>  \/\/ memory allocation _obj.f = 5;    \/\/ write final field in constructor [StoreStore] obj = _obj;       \/\/ publish<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e <code>StoreStore<\/code> \u0431\u0430\u0440\u044c\u0435\u0440 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 store \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u043e\u043a\u0440\u0443\u0433 \u0431\u0430\u0440\u044c\u0435\u0440\u0430, \u043d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0438 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, <code>StoreStore<\/code> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430, \u0435\u0441\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0443\u0432\u0438\u0434\u0435\u043b \u0437\u0430\u043f\u0438\u0441\u044c, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u0427\u0438\u0442\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Object _obj = obj;  [LoadLoad] r1 = _obj.f; \/\/ read final field<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c <code>LoadLoad<\/code> \u0431\u0430\u0440\u044c\u0435\u0440 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u043b \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0441 \u0447\u0442\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u043b\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>volatile<\/code>, \u044d\u0442\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0443\u0436\u0435 \u0434\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u0445 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 x86.<\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u043e\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 HotSpot JVM (\u0441\u043c. <a href=\"http:\/\/hg.openjdk.java.net\/jdk\/jdk\/file\/ee1d592a9f53\/src\/hotspot\/share\/opto\/parse1.cpp#l1001\" rel=\"nofollow noopener noreferrer\">http:\/\/hg.openjdk.java.net\/jdk\/jdk\/file\/ee1d592a9f53\/src\/hotspot\/share\/opto\/parse1.cpp#l1001<\/a>), \u043d\u0430\u043c \u043d\u0435\u044f\u0432\u043d\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 non-<code>final<\/code> \u043f\u043e\u043b\u0435\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0434\u0435\u0442\u0430\u043b\u044c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f \u0441\u043f\u0435\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u0421\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 <code>final<\/code> \u043f\u043e\u043b\u0435\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0448\u0430\u0440\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0442\u0440\u0435\u0434\u0430\u043c\u0438. \u041d\u043e \u0431\u0435\u0437 \u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 JMM \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435 \u043f\u0440\u0430\u0432\u0434\u043e\u0439, \u0432\u0435\u0434\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0430\u0441\u044c. \u0418\u043c\u0435\u043d\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e JMM \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 <code>final<\/code> \u043f\u043e\u043b\u0435\u0439, \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0448\u0430\u0440\u0438\u0442\u044c \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>final<\/code> \u043f\u043e\u043b\u0435\u0439 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u041f\u0443\u0441\u0442\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class Foo {     private final int a; \/* always visible *\/      public Foo() {         this.a = 5;     } } public class Bar {     private final int b; \/* always visible *\/      public Foo() {         this.b = 7;     } } public class DataHolder {     private final Foo foo; \/* always visible *\/     private final int c; \/* always visible *\/     private Bar bar; \/* may not be visible *\/     private int d; \/* may not be visible *\/      public DataHolder() {         this.foo = new Foo();         this.bar = new Bar();         this.c = 9;         this.d = 10;         \/* StoreStore *\/     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u2014 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class FinalFieldExample {      private DataHolder instance;      public void writer() {         instance = new DataHolder();     }      public void reader() {         DataHolder instance = this.instance; \/* data race *\/         \/* LoadLoad *\/         if (instance != null) {             Foo foo = instance.foo; \/* guaranteed to see non-null reference *\/             int a = foo.a; \/* guaranteed to see 5 *\/              int c = instance.c; \/* guaranteed to see 9 *\/              Bar bar = instance.bar; \/* no guarantee - may be null *\/             if (bar != null) {                 int b = bar.b; \/* guaranteed to see 7 *\/             }              int d = instance.d; \/* no guarantee - may be 0 (default value) *\/         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0425\u043e\u0442\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>instance<\/code> \u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043e\u043d\u043a\u0435, \u043d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 non-null \u0441\u0441\u044b\u043b\u043a\u0443, \u0442\u043e \u043d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 <code>final<\/code> \u043f\u043e\u043b\u0435\u0439 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0433\u043e\u043d\u043a\u0438<\/li>\n<li>\u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 <code>final<\/code> \u043f\u043e\u043b\u0435\u0439, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0438 (reference variable), \u0442\u043e \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c <code>final<\/code> \u043f\u043e\u043b\u0435\u0439 \u044d\u0442\u0438\u0445 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u042d\u0442\u043e \u0432\u0438\u0434\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0443 <code>Foo<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043b\u043e\u0436\u0435\u043d \u0432 <code>DataHolder<\/code><\/li>\n<li>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u043e \u0432\u0441\u0435\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043f\u043e\u043c\u0435\u0442\u0438\u043b \u043a\u0430\u043a <code>no guarantee<\/code>, \u044f \u0432\u0430\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043e\u0432\u0440\u0430\u043b. \u041a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043d\u0430 HotSpot JVM \u043c\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0435\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0434\u043e StoreStore \u0431\u0430\u0440\u044c\u0435\u0440\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0434\u0435\u0442\u0430\u043b\u044c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f \u044f\u0437\u044b\u043a\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"benign-data-races\">Benign data races<\/h2>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 data race \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043b\u043e\u0445\u043e, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0433\u043e\u043d\u043a\u0430 \u0434\u0430\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0439. \u0422\u0430\u043a\u0438\u0435 \u0433\u043e\u043d\u043a\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <strong>benign data race<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u2014 \u0432\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043d\u0430 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e <a href=\"http:\/\/hg.openjdk.java.net\/jdk\/jdk\/file\/ee1d592a9f53\/src\/java.base\/share\/classes\/java\/lang\/String.java#l1531\" rel=\"nofollow noopener noreferrer\">String#hashCode()<\/a> \u0438\u0437 OpenJDK:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public final class String {     \/** Cache the hash code for the string *\/     private int hash; \/\/ Default to 0      \/**      * Cache if the hash has been calculated as actually being zero, enabling      * us to avoid recalculating this.      *\/     private boolean hashIsZero; \/\/ Default to false;      public int hashCode() {         \/\/ The hash or hashIsZero fields are subject to a benign data race,         \/\/ making it crucial to ensure that any observable result of the         \/\/ calculation in this method stays correct under any possible read of         \/\/ these fields. Necessary restrictions to allow this to be correct         \/\/ without explicit memory fences or similar concurrency primitives is         \/\/ that we can ever only write to one of these two fields for a given         \/\/ String instance, and that the computation is idempotent and derived         \/\/ from immutable state         int h = hash;         if (h == 0 &amp;&amp; !hashIsZero) {             h = isLatin1() ? StringLatin1.hashCode(value)                     : StringUTF16.hashCode(value);             if (h == 0) {                 hashIsZero = true;             } else {                 hash = h;             }         }         return h;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u043e\u043b\u044f <code>hash<\/code> \u0438 <code>hashIsZero<\/code> \u043d\u0435 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u0430\u043a <code>volatile<\/code>, \u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438 \u043d\u0435\u0442 happens-before \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0438 \u0447\u0442\u0435\u043d\u0438\u0435\u043c. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0442\u0440\u0435\u0434 \u0443\u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>hash<\/code> \u0438\u043b\u0438 <code>hashIsZero<\/code>, \u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0440\u0435\u0434 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u043f\u0430\u0441\u043d\u044b\u0439 data race, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439. \u042d\u0442\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>hashCode<\/code> \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 Java \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c\u0438), \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430.<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0434\u0430\u043b\u0430 \u0432\u0430\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 JMM, \u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u0425\u043e\u0442\u044f \u044f \u0438 \u043f\u0440\u0438\u0432\u0451\u043b \u0437\u0434\u0435\u0441\u044c \u043c\u043d\u043e\u0433\u043e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u044f \u043b\u0438\u0448\u044c \u0445\u043e\u0442\u0435\u043b \u0434\u0430\u0442\u044c \u0432\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c JMM. \u041f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u043c\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 JMM \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430 \u0432\u0430\u0441, \u0432\u0435\u0434\u044c \u043e\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u0441 \u0442\u043e\u0439 \u0446\u0435\u043b\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0440\u044b\u0442\u044c, \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0438\u0436\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0432\u0430\u0441 \u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c memory reordering.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c JMM, \u0438 \u0434\u0430 \u043f\u0440\u0435\u0431\u0443\u0434\u0435\u0442 \u0441 \u0432\u0430\u043c\u0438 thread safety.<\/p>\n<p>  <\/p>\n<p>P.S: \u0438 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435: <strong>data races are evil<\/strong>.<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h2 id=\"resursy\">\u0420\u0435\u0441\u0443\u0440\u0441\u044b<\/h2>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 <a href=\"https:\/\/github.com\/blinky-z\/JmmArticleHabr\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/blinky-z\/JmmArticleHabr<\/a>. \u0422\u0430\u043c \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u0430\u0442\u044c\u044e jcstress \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u043d\u0430 x86\/arm64.<\/p>\n<p>  <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Memory_ordering\" rel=\"nofollow noopener noreferrer\">Memory ordering<\/a>, Wikipedia<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Memory_model_(programming)\" rel=\"nofollow noopener noreferrer\">Memory model<\/a>, Wikipedia<\/li>\n<li><a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se17\/html\/jls-17.html#jls-17.4\" rel=\"nofollow noopener noreferrer\">JLS \u00a717.4. Memory Model<\/a><\/li>\n<li><a href=\"http:\/\/www.cs.umd.edu\/~pugh\/java\/memoryModel\/index.html\" rel=\"nofollow noopener noreferrer\">The Java Memory Model<\/a> \u2014 &#171;\u0434\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430&#187; JMM, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u043a\u0443\u0447\u0443 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/li>\n<li><a href=\"https:\/\/gee.cs.oswego.edu\/dl\/jmm\/cookbook.html\" rel=\"nofollow noopener noreferrer\">The JSR-133 Cookbook<\/a> \u2014 \u043d\u0435\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0433\u0430\u0439\u0434\u043b\u0430\u0439\u043d \u043f\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 JMM \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 JDK, Doug Lea<\/li>\n<li><a href=\"https:\/\/raw.githubusercontent.com\/tpn\/pdfs\/master\/Memory%20Barriers%20-%20a%20Hardware%20View%20for%20Software%20Hackers%20(July%2023%2C%202010).pdf\" rel=\"nofollow noopener noreferrer\">Memory Barriers \u2014 a Hardware View for Software Hackers<\/a> \u2014 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043e\u0431\u0437\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u044b CPU, \u043a\u044d\u0448\u0430 \u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438<\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/37725497\/how-does-memory-reordering-help-processors-and-compilers\/37739933#37739933\" rel=\"nofollow noopener noreferrer\">How does memory reordering help processors and compilers?<\/a>, StackOverflow<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0411\u043b\u043e\u0433 \u0410\u043b\u0435\u043a\u0441\u0435\u044f \u0428\u0438\u043f\u0438\u043b\u0435\u0432\u0430 \u2014 \u044d\u0442\u043e \u0446\u0435\u043b\u0430\u044f \u043a\u043b\u0430\u0434\u0435\u0437\u044c \u0437\u043d\u0430\u043d\u0438\u0439 \u043f\u0440\u043e JMM \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e. \u041a\u0440\u0430\u0439\u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0435\u0433\u043e \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/shipilev.net\/blog\/2014\/jmm-pragmatics\/\" rel=\"nofollow noopener noreferrer\">Java Memory Model Pragmatics<\/a>, blog post by Shipilev<\/li>\n<li><a href=\"https:\/\/shipilev.net\/blog\/2014\/safe-public-construction\/\" rel=\"nofollow noopener noreferrer\">Safe Publication and Safe Initialization in Java<\/a>, blog post by Shipilev<\/li>\n<li><a href=\"https:\/\/shipilev.net\/blog\/2016\/close-encounters-of-jmm-kind\/\" rel=\"nofollow noopener noreferrer\">Close Encounters of The Java Memory Model Kind<\/a>, blog post by Shipilev<\/li>\n<li><a href=\"https:\/\/shipilev.net\/blog\/2014\/all-fields-are-final\/\" rel=\"nofollow noopener noreferrer\">All Fields Are Final<\/a>, blog post by Shipilev<\/li>\n<\/ul>\n<p>  <\/p>\n<p>Compiler Memory Ordering:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/preshing.com\/20120625\/memory-ordering-at-compile-time\/\" rel=\"nofollow noopener noreferrer\">Memory Ordering at Compile Time<\/a>, blog post<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Instruction_scheduling\" rel=\"nofollow noopener noreferrer\">Instruction scheduling<\/a>, Wikipedia<\/li>\n<\/ul>\n<p>  <\/p>\n<p>CPU Memory ordering\/Memory Barrier:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/www.cs.utexas.edu\/~bornholt\/post\/memory-models.html\" rel=\"nofollow noopener noreferrer\">Memory Consistency Models: A Tutorial<\/a>, blog post<\/li>\n<li><a href=\"https:\/\/preshing.com\/20120710\/memory-barriers-are-like-source-control-operations\/\" rel=\"nofollow noopener noreferrer\">Memory Barriers Are Like Source Control<\/a>, blog post<\/li>\n<li><a href=\"https:\/\/preshing.com\/20120930\/weak-vs-strong-memory-models\/\" rel=\"nofollow noopener noreferrer\">Weak vs. Strong Memory Models<\/a>, blog post<\/li>\n<li><a href=\"https:\/\/www.cis.upenn.edu\/~devietti\/classes\/cis601-spring2016\/sc_tso.pdf\" rel=\"nofollow noopener noreferrer\">Sequential Consistency &amp; Total Store Order<\/a>, slides<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Memory_barrier\" rel=\"nofollow noopener noreferrer\">Memory barrier<\/a>, Wikipedia<\/li>\n<li><a href=\"https:\/\/mechanical-sympathy.blogspot.com\/2011\/07\/memory-barriersfences.html?m=1\" rel=\"nofollow noopener noreferrer\">Memory Barriers\/Fences<\/a>, blog post<\/li>\n<li><a href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/torvalds\/linux.git\/tree\/Documentation\/memory-barriers.txt\" rel=\"nofollow noopener noreferrer\">Linux kernel memory barriers<\/a>, Linux kernel docs<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Memory_ordering#Runtime_memory_ordering\" rel=\"nofollow noopener noreferrer\">\u0421\u0432\u043e\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0439 \u0441\u0440\u0435\u0434\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0438\u043a\u0440\u043e\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440<\/a><\/li>\n<li>Intel (x86):<br \/> \n<ul>\n<li><a href=\"https:\/\/www.intel.com\/content\/dam\/www\/public\/us\/en\/documents\/manuals\/64-ia-32-architectures-software-developer-system-programming-manual-325384.pdf#G13.14501\" rel=\"nofollow noopener noreferrer\">Intel Memory Ordering<\/a><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/50307693\/does-an-x86-cpu-reorder-instructions\" rel=\"nofollow noopener noreferrer\">Does an x86 CPU reorder instructions?<\/a>, StackOverflow<\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/37798053\/making-sense-of-memory-barriers\" rel=\"nofollow noopener noreferrer\">Making sense of Memory Barriers<\/a><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/11105827\/what-is-a-store-buffer\" rel=\"nofollow noopener noreferrer\">what is a store buffer?<\/a>, StackOverflow<\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/54876208\/size-of-store-buffers-on-intel-hardware-what-exactly-is-a-store-buffer\" rel=\"nofollow noopener noreferrer\">Size of store buffers on Intel hardware? What exactly is a store buffer?<\/a>, StackOverflow<\/li>\n<\/ul>\n<\/li>\n<li>AMD:<br \/> \n<ul>\n<li><a href=\"https:\/\/developer.arm.com\/documentation\/den0024\/a\/Memory-Ordering?lang=en\" rel=\"nofollow noopener noreferrer\">ARM Memory Ordering<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>CPU Cache:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/CPU_cache\" rel=\"nofollow noopener noreferrer\">CPU cache<\/a>, Wikipedia<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Cache_hierarchy\" rel=\"nofollow noopener noreferrer\">Cache hierarchy<\/a>, Wikipedia<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Cache_coherence\" rel=\"nofollow noopener noreferrer\">Cache coherence<\/a>, Wikipedia<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/MESI_protocol\" rel=\"nofollow noopener noreferrer\">MESI protocol<\/a>, Wikipedia<\/li>\n<li><a href=\"https:\/\/mechanical-sympathy.blogspot.com\/2013\/02\/cpu-cache-flushing-fallacy.html\" rel=\"nofollow noopener noreferrer\">Mechanical Sympathy: CPU Cache Flushing Fallacy<\/a>, blog post<\/li>\n<li><a href=\"https:\/\/fgiesen.wordpress.com\/2014\/07\/07\/cache-coherency\/\" rel=\"nofollow noopener noreferrer\">Cache coherency primer<\/a>, blog post<\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/30958375\/memory-barriers-force-cache-coherency\" rel=\"nofollow noopener noreferrer\">Memory barriers force cache coherency?<\/a>, StackOverflow<\/li>\n<\/ul>\n<p>  <\/p>\n<p>Volatile:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/jpbempel.github.io\/2012\/10\/09\/volatile.html\" rel=\"nofollow noopener noreferrer\">Volatile<\/a>, blog post<\/li>\n<li><a href=\"https:\/\/jpbempel.github.io\/2015\/05\/26\/volatile-and-memory-barriers.html\" rel=\"nofollow noopener noreferrer\">Volatile and memory barriers<\/a>, blog post<\/li>\n<li><a href=\"http:\/\/web.archive.org\/web\/20210221170926\/https:\/\/www.ibm.com\/developerworks\/java\/library\/j-jtp06197\/\" rel=\"nofollow noopener noreferrer\">Java theory and practice: Managing volatility<\/a>, blog post by Brian Goetz<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u043d\u0438\u0433\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/www.morganclaypool.com\/doi\/10.2200\/S00962ED2V01Y201910CAC049\" rel=\"nofollow noopener noreferrer\">A Primer on Memory Consistency and Cache Coherence<\/a><\/li>\n<li><a href=\"https:\/\/www.amazon.com\/Java-Concurrency-Practice-Brian-Goetz\/dp\/0321349601\" rel=\"nofollow noopener noreferrer\">Java Concurrency in Practice<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/685518\/\"> https:\/\/habr.com\/ru\/post\/685518\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/eb\/nm\/iu\/ebnmiu3gfh1rn74kqsnvqrv2rnm.png\" data-src=\"https:\/\/habrastorage.org\/webt\/eb\/nm\/iu\/ebnmiu3gfh1rn74kqsnvqrv2rnm.png\"\/><\/p>\n<p>  <\/p>\n<p>\u042f \u043f\u0440\u043e\u0432\u0435\u043b \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 JMM \u043c\u043d\u043e\u0433\u043e \u0447\u0430\u0441\u043e\u0432 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u044e\u0441\u044c \u0441 \u0432\u0430\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c Java Memory Model (JMM) \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0414\u0430, \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u0440\u043e JMM\/happens-before, \u0438, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0435\u0437\u0436\u0435\u043d\u043d\u0443\u044e \u0442\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043c\u0438\u043c\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0434\u0430\u0442\u044c \u0432\u0430\u043c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 JMM, \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0430\u0442\u044c \u043e \u0442\u0430\u043a\u0438\u0445 \u0432\u0435\u0449\u0430\u0445 \u043a\u0430\u043a memory ordering, data race \u0438 happens-before. JMM \u2014 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0442\u0435\u043c\u0430 \u0438 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043d\u0435 \u043d\u0430 \u0441\u043b\u043e\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043c\u043e\u0438\u0445 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0446\u0438\u0442\u0430\u0442\u0430\u043c\u0438 \u0438\u0437 \u0441\u043f\u0435\u043a\u0438, \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c \u0438 jcstress \u0442\u0435\u0441\u0442\u0430\u043c\u0438.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-337697","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/337697","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=337697"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/337697\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=337697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=337697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=337697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}