From owner-java@jp.FreeBSD.org Sat Aug  6 23:03:12 2005
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6p2+3.4W/8.11.3) id j76E3CD62771;
	Sat, 6 Aug 2005 23:03:12 +0900 (JST)
	(envelope-from owner-java@jp.FreeBSD.org)
Received: from mail3.inetd.co.jp (mail3.inetd.co.jp [211.13.206.143])
	by castle.jp.FreeBSD.org (8.11.6p2+3.4W/8.11.3) with ESMTP/inet id j76E3BI62766
	for <java@jp.FreeBSD.org>; Sat, 6 Aug 2005 23:03:11 +0900 (JST)
	(envelope-from yamasa@bsdhouse.org)
Received: from localhost (ez43.ade3.point.ne.jp [202.161.225.43])
	by mail3.inetd.co.jp (8.11.7/3.7W05080511) with ESMTP id j76E35Z81788
	for <java@jp.FreeBSD.org>; Sat, 6 Aug 2005 23:03:05 +0900 (JST)
Message-Id: <20050806.230303.59462185.yamasa@bsdhouse.org>
To: java@jp.FreeBSD.org
From: OISHI Masakuni <yamasa@bsdhouse.org>
X-Mailer: Mew version 3.3 on Emacs 21.3 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Reply-To: java@jp.FreeBSD.org
Precedence: list
Date: Sat, 06 Aug 2005 23:03:03 +0900
X-Sequence: java 548
Subject: [java 548] =?ISO-2022-JP?B?GyRCQjMbKEI=?= Java Memory Model
Sender: owner-java@jp.FreeBSD.org
X-Originator: yamasa@bsdhouse.org
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+050320

$BBg@P$G$9!#(B

3$BG/$V$j$J$s$G$9$,!"(B
[java 123] Java Memory Model
$B$NOCBj$NB3$-$G$9!#(B

"The Java Language Specification, Third Edition"($B0J2<(BJLS3)$B$,=P$F!"(B
generics$B$d(BAnnotation$B$J$I$,BgI}$K2CI.$5$l$F$$$^$9!#(B
http://java.sun.com/docs/books/jls/index.html

$B$b$A$m$s!"(BJSR-133$B$N@.2L$G$"$k(BJava Memory Model$B$K$D$$$F$b(B
$BBgI}$K=$@5$5$l$F$$$^$9!#(B
http://java.sun.com/docs/books/jls/third_edition/html/memory.html
Second Edition$B$N(BMemory Model$B$G$O!"6qBNE*$K$I$&$$$&7k2L$,5/$3$jF@$k$N$+(B
$B$$$^$$$A$O$C$-$j$7$J$+$C$?$N$G$9$,!"(BJLS3$B$G$O(B"happens-before order"
$B$H$$$&35G0$rF3F~$7$F!"Hs>o$K87L)$JDj5A$,9T$J$o$l$F$$$^$9!#(B
($BJ#;($J$N$OAjJQ$o$i$:$G$9$,!D(B)

$B:#2s$NJQ99E@$GFCD'E*$J$N$O!"(Bvolatile$BJQ?t$X$NFI$_=q$-$,(B
$BHs>o$K6/$/=g=x$E$1$5$l$k$h$&$K$J$C$?$3$H$G$9$M!#(B
$B$=$N7k2L!"0J2<$N$h$&$J(B"Double-Checked Locking"$B%Q%?!<%s$,(B
$B0U?^$7$?DL$j$K@5$7$/F0:n$9$k$h$&$K$J$C$F$$$^$9!#(B
====
class Foo {
   // $B$3$N(Bvolatile$B@k8@$,%_%=!#(B
   private volatile Helper helper = null;
   public Helper getHelper() {
      Helper tmp = helper; // volatile read (1)
      // $B$3$3$G(B tmp != null $B$N>l9g!"2<$N(B volatile write (2) $B$H$N4V$G(B
      // happens-before$B4X78$,@.N)$9$k$N$G!"(B(2)$B0JA0$N=i4|2==hM}$,(B
      // $BA4$F40N;$7$?7k2L$,8+$($k$3$H$,J]>Z$5$l$k!#(B
      if (tmp == null) {
         synchronized(this) {
            tmp = helper;
            if (tmp == null) {
               tmp = new Helper();
               helper = tmp; // volatile write (2)
            }
         }
      }
      return tmp;
   }
}
====
$B$?$@$3$l$O!"(Bvolatile$BJQ?t$X$NFI$_=q$-$K$+$+$k%3%9%H$,(B
$BBg$-$/A}$($?$3$H$b0UL#$7$F$$$^$9!#(B

http://gee.cs.oswego.edu/dl/jmm/cookbook.html
$B>e5-$NJ8=q$O?7$7$$(BJava Memory Model$B$K4p$E$$$?(BJava VM$B$d(BJIT$B%3%s%Q%$%i$J$I$r(B
$B:n$k:]$N%,%$%I%i%$%s$G$9$,!"(Bvolatile$BJQ?t$X$NFI$_=q$-$NA08e$K$O(B
$BE,@Z$J%a%b%j%P%j%"L?Na$N<B9T$,5a$a$i$l$F$$$^$9!#(B
$B$^$?!"$3$l0J30$K$b(BFinal Field$B$N=i4|2=$N8e$K$b%a%b%j%P%j%"$,(B
$BI,MW$G$"$C$?$j$H!"$$$m$$$m6=L#?<$$E@$,$"$C$FLLGr$$$G$9!#(B

$B$3$l$rFI$s$@8e$K(B java.util.concurrent.ConcurrentHashMap $B$J$I$N<BAu$r(B
$B8+$F$_$k$H!"$$$m$$$m$HL\$+$iNZ$,Mn$A$k$H;W$$$^$9!#(B


-- 
$BBg@P>-K.(B
