From owner-java@jp.FreeBSD.org Sat Jul 27 05:20:54 2002
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) id g6QKKsI83751;
	Sat, 27 Jul 2002 05:20:54 +0900 (JST)
	(envelope-from owner-java@jp.FreeBSD.org)
Received: from cs20.catv.ne.jp (cs20.catv.ne.jp [202.232.171.40])
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) with ESMTP/inet id g6QKKsn83733
	for <java@jp.FreeBSD.org>; Sat, 27 Jul 2002 05:20:54 +0900 (JST)
	(envelope-from yamasa@ec.catv.ne.jp)
Received: from localhost by cs20.catv.ne.jp (8.9.1/3.7W)
	id FAA17806; Sat, 27 Jul 2002 05:20:52 +0900 (JST)
Date: Sat, 27 Jul 2002 05:20:52 +0900 (JST)
Message-Id: <20020727.052052.59459742.yamasa@ec.catv.ne.jp>
To: java@jp.FreeBSD.org
From: OISHI Masakuni <yamasa@ec.catv.ne.jp>
In-Reply-To: <20020724192325.55472fab.daichi@ongs.co.jp>
References: <20020722122116.218d7c4a.daichi@jp.freebsd.org>
	<20020724.012519.74758165.yamasa@ec.catv.ne.jp>
	<20020724192325.55472fab.daichi@ongs.co.jp>
X-Mailer: Mew version 2.1 on Emacs 21.2 / 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
X-Sequence: java 149
Subject: [java 149] Re: Java Memory Model
Errors-To: owner-java@jp.FreeBSD.org
Sender: owner-java@jp.FreeBSD.org
X-Originator: yamasa@ec.catv.ne.jp
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+020725

$BBg@P$G$9!#(B
# $BJV;v$,CY$/$J$C$F$9$_$^$;$s!#(B

From: daichi <daichi@ongs.co.jp>
Subject: [java 138] Re: Java Memory Model
Date: Wed, 24 Jul 2002 19:23:25 +0900

($B0zMQ=g$rF~$l49$($F$$$^$9(B)
> $B$"$H!"4NItJ,$@$H;W$o$l$k$3$3$N$H$3$m$,(B
> 
>   The most obvious reason it doesn't work it that the writes that 
>   initialize the Helper object and the write to the helper field 
>   can be done or perceived out of order. Thus, a thread which 
>   invokes getHelper() could see a non-null reference to a helper 
>   object, but see the default values for fields of the helper 
>   object, rather than the values set in the constructor. 
> 
>   If the compiler inlines the call to the constructor, then the 
>   writes that initialize the object and the write to the helper 
>   field can be freely reordered if the compiler can prove that 
>   the constructor cannot throw an exception or perform synchronization.
> 
>   Even if the compiler does not reorder those writes, on a 
>   multiprocessor the processor or the memory system may reorder 
>   those writes, as perceived by a thread running on another processor. 
> 
> $B$h$/$o$+$i$J$/$F!#(B
> 
>   class Foo { 
>     private Helper helper = null;
>     public Helper getHelper() {
>       if (helper == null) 
>         synchronized(this) {
>           if (helper == null) 
>             helper = new Helper();
>         }    
>       return helper;
>       }
>     // other functions and members...
>     }
> 
> $B$O!"$D$^$j(B
> 
>             helper = new Helper();
> 
> $B$NItJ,$,(Batomic$B$8$c$J$$$s$G$9$h$M(B($B$3$N9M$($,0c$C$F$$$k$N$+$J$!(B)$B!#(B

helper = new Helper();
$B$r0J2<$N$h$&$K=q$-49$($F$_$^$9!#(B
---
Helper new_instance = malloc(sizeof(Helper)); // $B%a%b%j3NJ](B
new_instance.Helper();                        // $B%3%s%9%H%i%/%?8F$S=P$7(B
helper = new_instance;                        // $B;2>H$NBeF~(B
---
$B$3$l$O!"$5$i$K0J2<$N$h$&$K=q$-49$($i$l$k$+$b$7$l$^$;$s!#(B
---
helper = malloc(sizeof(Helper)); // (1)
helper.Helper();                 // (2)
---

$B$5$F!"(B(1)$B$H(B(2)$B$N4V$KJL$N%9%l%C%I$,(B getHelper() $B$r8F$S=P$7$?$i(B
$B$I$&$J$k$G$7$g$&$+!#(B
$B$3$N>l9g!"(Bhelper != null $B$K$b$+$+$o$i$:!"$=$N;2>H@h$N%$%s%9%?%s%9$O(B
$B$^$@%3%s%9%H%i%/%?$,8F$S=P$5$l$F$$$J$$$3$H$K$J$j$^$9!#(B

$B$3$N$h$&$J;vBV$rHr$1$k$?$a$K$O!"%3%s%9%H%i%/%?Fb$G$NF0:n$,(B
$B%a%$%s%a%b%j$KH?1G$5$l$k$N$rBT$C$F$+$i!"JQ?t(Bhelper$B$X;2>H$rBeF~$9$k(B
$B$h$&$K$9$l$P$h$$$N$G$O$J$$$+!"$H;W$o$l$k$+$b$7$l$^$;$s!#(B
$B$7$+$7!"$=$l$G$b$^$@IT==J,$G$9!#(B
$B$J$<$J$i!"(BJMM$B$N$b$H$G$O!"$$$/$i%a%$%s%a%b%j$,JQ99$5$l$F$b(B
read $B$H(B load $B$,5/$3$i$J$$8B$j$=$NJQ99$OB>$N%9%l%C%I$+$i(B
$B8+$k$3$H$,$G$-$J$$$+$i$G$9!#(B
read $B$H(B load $B$r6/@)$9$k$K$O!"7k6I(B synchronized $B$G%m%C%/$r(B
$B9T$J$&$7$+$J$$$o$1$G$9!#(B

> $B$"$H!"(BDCL$B$,F0:n$9$kNc$H$7$F>R2p$5$l$F$$$k(BThreadLocal$B$rMxMQ$9$kNc$O(B
> $B7k6IA0=R$7$?%3!<%I$H2?$,0c$&$N$+0c$$$,$o$+$i$:!#(B

$B=i4|2=$5$l$?%*%V%8%'%/%H$rB>$N%9%l%C%I$,;2>H$9$k$K$O(B
$B:GDc(B1$B2s$O%m%C%/$r9T$J$o$J$1$l$P$J$j$^$;$s!#(B
$B5U$K8@$($P!"$9$G$K(B1$B2s%m%C%/$r9T$J$C$F$$$l$P0J9_$O0BA4$K(B
$B%*%V%8%'%/%H$X%"%/%;%9$9$k$3$H$,$G$-$k$o$1$G$9!#(B
$B$=$3$G!"3F%9%l%C%IKh$K%m%C%/$r9T$J$C$?$3$H$,$"$k$+$I$&$+$r(B
ThreadLocal$BJQ?t$G4IM}$9$k$h$&$K$7$F$$$k$N$G$9!#(B


>  $B!Z(BDCL(Double-Checked Locking) $B$H$O![(B
>   synchronized$B%V%m%C%/$K$h$kF14|$r:G=i$N%*%V%8%'%/%H$N@8@.;~(B
>   $B$N$_$K$J$k$h$&$K(Bsynchronized$B%V%m%C%/$rH=DjJ8$G$/$/$k$J$I$r(B
>   $B9T$&%^%k%A%9%l%C%I4D6-$K$*$1$kCY1d=i4|2=J}K!!#(B
>   ($B4|BTDL$j$KF0$/$N$G$"$l$P(B)$B%*%V%8%'%/%H$NCY1d@8@.$rJ#?t$N%9(B
>   $B%l%C%I$,F0:n$7$F$$$F$b=EJ#$J$/3N<B$K9T$&$3$H$,$G$-!"$=$NF1(B
>   $B4|;~4V$r:G=i$N@8@.;~$N$_$K2!$5$($k$3$H$,$G$-$k(B
> 
>  $B!Z(BDCL$B$NLdBjE@![(B
>   DCL$B$O<B9T$9$k4D6-$dJ}K!$K$h$C$F@5$7$/F0:n$9$k>l9g$H$=$&$G(B
>   $B$J$$>l9g$,$"$k!#(BJava$B$G$O4|BTF0$+$J$$$3$H$,$"$k!#(B
> 
>  $B!Z(BJava$B$K$*$1$k(BDCL$B$NF0:n![(B
>   Java$B$G$O(BDCL$B$,@5$7$/F0:n$7$J$$!#<gMW$?$kFs$D$NM}M3$O2<5-$N(B
>   $BDL$j$G$"$k!#(B
> 
>     1. $B!V%*%V%8%'%/%H$N=i4|2=!W$H!V%U%#!<%k%I$X$N=q$-9~$_!W(B
>        $B$N4V$K=g=x5,B'$,$J$$!#%3%s%Q%$%i$,$3$l$i=g=x$r5UE>(B
>        $B$5$;$k$3$H$O@5Ev$G$"$k!#%3%s%Q%$%i$,$3$l$i=hM}$r5U(B
>        $B$K$9$k$H(BDCL$B$O@5$7$/F0:n$7$J$$2DG=@-$,$"$k!#(B
>        # $B8e=R$7$^$9$,$3$NItJ,$,M}2r$G$-$:(B
> 
>     2. monitorexit($B;2>H$KBP1~$7$?%b%K%?$r2rJ|$9$k%P%$%HL?Na(B)
>        $B$K4X$9$k5,B'$K5/0x$9$kM}M3$,$"$k!#(Bmonitorexit$B$NA0$N(B
>        $B=hM}$O%b%K%?$,2rJ|$5$l$kA0$K<B9T$5$l$J$1$l$P$J$i$J$$(B
>        $B$H$$$&5,B'$,$"$k$,!"(Bmonitorexit$B$h$j8e$N=hM}$,%b%K%?$,(B
>        $B2rJ|$5$l$kA0$K$5$l$F$$$O$$$1$J$$$H$$$&5,B'$O$J$$!#(B
>        $B0lJ}J}8~$J%a%b%jJ]8nL?Na$r;}$C$F$$$k%W%m%;%C%5$G$O(B
>        synchronized$B%V%m%C%/Fb$K(Bsynchronized$B%V%m%C%/$,$"$k>l(B
>        $B9g!"=hM}$r$9$Y$F0l$D$N(Bsynchronized$B%V%m%C%/$XA0E]$7(B
>        $B$=$NL?Na$rMxMQ$9$k$3$H$,@-G=$N8~>e$K$D$J$,$k!#$h$C$F(B
>        $B$=$N$h$&$K=hM}$5$l$k$3$H$O$*<j:"$G@5Ev$J=hM}$G$"$k!#(B
>        $B$3$N$?$a!"(Bsynchronized$B%V%m%C%/Fb$K(Bsynchronized$B%V%m%C%/(B
>        $B$r@_$1$F=hM}$rF14|$5$;$h$&$H$$$&;n$_$O!"7k6I(B1.$B$HF1$8(B
>        $B>u67$K$J$k$?$a0UL#$,$J$$!#(B
> 
>  $B!Z(BJava$B$K$*$1$k(BDCL$B$X$NBP1~=hCV![(B
> 
>     1. DCL$B$rMxMQ$7$J$$!#(BDCL$B$rMxMQ$9$k%2%C%?!<%a%=%C%I$N%3%9(B
>        $B%H$OHy!9$?$k$b$N$G$"$m$&!#%"%W%j%1!<%7%g%s$N@-G=Nt2=(B
>        $B$,$3$N%a%=%C%I$K$+$+$C$F$$$k$o$1$G$J$$$N$J$i!"(BDCL$B$r(B
>        $BMxMQ$7$J$$$GNI$$!#(B
> 
>     2. 32bit primitive value(int)$B$r(Bsynchronized$B%V%m%C%/$XF~$k(B
>        $B$+F~$i$J$$$+$NH=Dj=hM}$KMxMQ$9$k!#(B32bit int$B$O=hM}$,(B
>        atmic$B$G$"$k$3$H$,J]>Z$5$l$F$$$k!#$3$N$?$a;2>H$rMxMQ(B
>        $B$7$FH=Dj$9$k>l9g$H0c$$(BDCL$B$OF0:n$9$k(B

$B$3$l$OHs>o$K8m2r$r@8$_$d$9$$I=8=$G$9!#(B
---
2. $B=i4|2=$9$kBP>]$NJQ?t$,C1FH$N(B32bit primitive$BJQ?t$G$"$j!"(B
   $B$=$NCM$r8+$k$@$1$G=i4|2=:Q$_$+$I$&$+$,$o$+$k>l9g$K8B$j!"(B
   DCL$B$O@5$7$/F0:n$9$k!#(B
---
$B$H$9$k$N$,$h$$$H;W$$$^$9!#(B

>     3. java.lang.ThreadLocal$B$rMxMQ$9$k!#(B
> 
>  $B!Z(BJava$B$K$*$1$k(BDCL$B$X$NBeBX$(0F![(B
>     static$B$J%/%i%9JQ?t$O;2>H$,$"$k$^$G=i4|2=$5$l$J$$$N$G!"(B
>     $B$3$l$r(BDCL$B$NBe$o$j$H$7$F$O$I$&$+!#(B

static$B$J%/%i%9JQ?t$O!"$=$N%/%i%9$,%m!<%I$5$l$?$H$-$K(B
$B=i4|2=$5$l$^$9!#(B
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
$B$G$O!"(BHelperSingleton$B%/%i%9$r;HMQ$7$F$$$kNc$,$=$&$G$9$M!#(B

--
$BBg@P>-K.(B
yamasa@ec.catv.ne.jp
