<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.2.1" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
	<title>Comments on: Модель памяти Java и атомарность операций (java memory model)</title>
	<link>http://www.javenue.info/post/81</link>
	<description>Блог разработчика о Java и родственных технологиях</description>
	<pubDate>Thu, 09 Sep 2010 00:09:55 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>

	<item>
		<title>By: artemv</title>
		<link>http://www.javenue.info/post/81#comment-63844</link>
		<author>artemv</author>
		<pubDate>Sun, 17 Jan 2010 18:19:23 +0000</pubDate>
		<guid>http://www.javenue.info/post/81#comment-63844</guid>
		<description>@c0nst
&lt;i&gt;Ключевое слово volatile говорит (в частности интерпретатору байт-кода) о том, что не нужно использовать регистровые оптимизации для этой переменной.&lt;/i&gt;
да, но_ так было и в 1.3, и в 1.4. ? только в 1.5 JMM даёт гарантию что volatile не будет "reorder-иться" с другими переменными на "multithread-овых" участках.
&lt;code&gt;
class A {
  private int i;
  private volatile j;
  void a() {
    i=1;
    j=2;
  }
}
&lt;/code&gt;

JMM-ское правило относительно volatile гарантирует что i выполнится перед j в любом thread-е.</description>
		<content:encoded><![CDATA[<p>@c0nst<br />
<i>Ключевое слово volatile говорит (в частности интерпретатору байт-кода) о том, что не нужно использовать регистровые оптимизации для этой переменной.</i><br />
да, но_ так было и в 1.3, и в 1.4. ? только в 1.5 JMM даёт гарантию что volatile не будет &#8220;reorder-иться&#8221; с другими переменными на &#8220;multithread-овых&#8221; участках.<br />
<code><br />
class A {<br />
  private int i;<br />
  private volatile j;<br />
  void a() {<br />
    i=1;<br />
    j=2;<br />
  }<br />
}<br />
</code></p>
<p>JMM-ское правило относительно volatile гарантирует что i выполнится перед j в любом thread-е.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Эндрю</title>
		<link>http://www.javenue.info/post/81#comment-57898</link>
		<author>Эндрю</author>
		<pubDate>Fri, 07 Aug 2009 10:14:05 +0000</pubDate>
		<guid>http://www.javenue.info/post/81#comment-57898</guid>
		<description>На http://java.sun.com/docs/books/tutorial/essential/concurrency/atomic.html есть такие строчки
"
* Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).
* Reads and writes are atomic for all variables declared volatile (including long and double variables). 
" 
- volatile для типа int не нужен, хотя, от него и хуже наверное не будет.
А использование обёртки java.util.concurrent.atomic.AtomicInteger, как заметил  Vladimir Dolzhenko, быда бы кстати. 
Но цель автора была, на сколько я понял, показать неатомарность операций "--"  и "++", поэтому и synchronized подойдёт :-)</description>
		<content:encoded><![CDATA[<p>На <a href="http://java.sun.com/docs/books/tutorial/essential/concurrency/atomic.html" rel="nofollow">http://java.sun.com/docs/books/tutorial/essential/concurrency/atomic.html</a> есть такие строчки<br />
&#8221;<br />
* Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).<br />
* Reads and writes are atomic for all variables declared volatile (including long and double variables).<br />
&#8221;<br />
- volatile для типа int не нужен, хотя, от него и хуже наверное не будет.<br />
А использование обёртки java.util.concurrent.atomic.AtomicInteger, как заметил  Vladimir Dolzhenko, быда бы кстати.<br />
Но цель автора была, на сколько я понял, показать неатомарность операций &#8220;&#8211;&#8221;  и &#8220;++&#8221;, поэтому и synchronized подойдёт <img src='http://www.javenue.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Leon</title>
		<link>http://www.javenue.info/post/81#comment-37259</link>
		<author>Leon</author>
		<pubDate>Fri, 19 Dec 2008 11:42:47 +0000</pubDate>
		<guid>http://www.javenue.info/post/81#comment-37259</guid>
		<description>Да, согласен, не обратил внимания на характер b.</description>
		<content:encoded><![CDATA[<p>Да, согласен, не обратил внимания на характер b.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: c0nst</title>
		<link>http://www.javenue.info/post/81#comment-37239</link>
		<author>c0nst</author>
		<pubDate>Fri, 19 Dec 2008 10:20:40 +0000</pubDate>
		<guid>http://www.javenue.info/post/81#comment-37239</guid>
		<description>Да, спасибо, забыл volatile поставить, чтобы гарантировать, что все потоки будут видеть одно и то же значение переменной i. Здесь имеет место понятие видимость (Visibility).
Ключевое слово volatile говорит (в частности интерпретатору байт-кода) о том, что не нужно использовать регистровые оптимизации для этой переменной.</description>
		<content:encoded><![CDATA[<p>Да, спасибо, забыл volatile поставить, чтобы гарантировать, что все потоки будут видеть одно и то же значение переменной i. Здесь имеет место понятие видимость (Visibility).<br />
Ключевое слово volatile говорит (в частности интерпретатору байт-кода) о том, что не нужно использовать регистровые оптимизации для этой переменной.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vladimir Dolzhenko</title>
		<link>http://www.javenue.info/post/81#comment-37229</link>
		<author>Vladimir Dolzhenko</author>
		<pubDate>Fri, 19 Dec 2008 08:49:06 +0000</pubDate>
		<guid>http://www.javenue.info/post/81#comment-37229</guid>
		<description>в приведённом примере вообще не гарантируется, что значение свойства i будет в потоке 2 будет такое же, какое оно будет записано в потоке 1. Опять же согласно Java Memory Model. Чтобы избежать этот нюанс св-во i должно иметь модификатор volatile, но даже это не ре?ит вопрос атомарности инкремента/дикремента

синхронизация через synchronized для соблюдения атомарности подобных операций - overhead, не мало обзоров на тему производительности - чтобы не потерять производительность, и в то же время иметь атомарность операций примитивов есть атомарные классы обёртки, н-р. java.util.concurrent.atomic.AtomicInteger.</description>
		<content:encoded><![CDATA[<p>в приведённом примере вообще не гарантируется, что значение свойства i будет в потоке 2 будет такое же, какое оно будет записано в потоке 1. Опять же согласно Java Memory Model. Чтобы избежать этот нюанс св-во i должно иметь модификатор volatile, но даже это не ре?ит вопрос атомарности инкремента/дикремента</p>
<p>синхронизация через synchronized для соблюдения атомарности подобных операций - overhead, не мало обзоров на тему производительности - чтобы не потерять производительность, и в то же время иметь атомарность операций примитивов есть атомарные классы обёртки, н-р. java.util.concurrent.atomic.AtomicInteger.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: c0nst</title>
		<link>http://www.javenue.info/post/81#comment-37217</link>
		<author>c0nst</author>
		<pubDate>Fri, 19 Dec 2008 08:15:04 +0000</pubDate>
		<guid>http://www.javenue.info/post/81#comment-37217</guid>
		<description>Атаморность поля b не имеет смысла в данном контексте, так как это поле экземпляра класса и у каждого потока есть свое собственное значение этого поля.
Как раз Java и не гарантирует атомрность инкремента, что собственно и показывает данный пример.</description>
		<content:encoded><![CDATA[<p>Атаморность поля b не имеет смысла в данном контексте, так как это поле экземпляра класса и у каждого потока есть свое собственное значение этого поля.<br />
Как раз Java и не гарантирует атомрность инкремента, что собственно и показывает данный пример.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Leon</title>
		<link>http://www.javenue.info/post/81#comment-37159</link>
		<author>Leon</author>
		<pubDate>Fri, 19 Dec 2008 03:40:39 +0000</pubDate>
		<guid>http://www.javenue.info/post/81#comment-37159</guid>
		<description>А разве этот пример доказывает неатомарность операции инкремента, ведь в программном фрагменте присутствует еще и условный переход? Это я к тому написал, что, понятно, в ма?инном коде операция инкремента будет состоять из нескольких инструкций, но насколько я помню джава все-таки гарантирует атомарность таких операций.</description>
		<content:encoded><![CDATA[<p>А разве этот пример доказывает неатомарность операции инкремента, ведь в программном фрагменте присутствует еще и условный переход? Это я к тому написал, что, понятно, в ма?инном коде операция инкремента будет состоять из нескольких инструкций, но насколько я помню джава все-таки гарантирует атомарность таких операций.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
