From owner-java@jp.FreeBSD.org Wed Jul 24 01:25:22 2002
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) id g6NGPML51688;
	Wed, 24 Jul 2002 01:25:22 +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 g6NGPKn51683;
	Wed, 24 Jul 2002 01:25:20 +0900 (JST)
	(envelope-from yamasa@ec.catv.ne.jp)
Received: from localhost by cs20.catv.ne.jp (8.9.1/3.7W)
	id BAA01911; Wed, 24 Jul 2002 01:25:18 +0900 (JST)
Date: Wed, 24 Jul 2002 01:25:19 +0900 (JST)
Message-Id: <20020724.012519.74758165.yamasa@ec.catv.ne.jp>
To: java@jp.FreeBSD.org, daichi@jp.FreeBSD.org
From: OISHI Masakuni <yamasa@ec.catv.ne.jp>
In-Reply-To: <20020722122116.218d7c4a.daichi@jp.freebsd.org>
References: <20020719163614.7ec433a8.daichi@jp.freebsd.org>
	<20020722.024117.74758272.yamasa@ec.catv.ne.jp>
	<20020722122116.218d7c4a.daichi@jp.freebsd.org>
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 137
Subject: [java 137] 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+020717

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

From: daichi <daichi@jp.FreeBSD.org>
Subject: [java 136] Re: Java Memory Model
Date: Mon, 22 Jul 2002 12:21:16 +0900

> > > DCL$BLdBj$N=$@5(B(JMM$B$rL@3N$K$7$F<BAu$rLdBj$,=P$J$$$h$&$KJQ99(B)$B$C$F(B
> > > $B8=:_$I$N>u67$K$"$k$+$4B8$8$NJ}$$$i$C$7$c$$$^$9$+!)(B
> > 
> > $B$=$b$=$b(BDCL$B<+BN$,IT@5$J%"%k%4%j%:%`$J$N$G$9$+$i!"(B
> > $B$H$j$"$($:$=$l$,F0$/$h$&$K(BJava$B$N;EMM$r$M$86J$2$k$H$$$&$N$O(B
> > $B$A$g$C$HJQ$@$H;W$$$^$9$h!#(B
> > $BC1$K!"(BDCL$B$r;H$o$J$1$l$P$$$$$@$1$NOC$G$9!#(B
> 
> $B!)(B
> $BKM$N(BDCL$B$KBP$9$kDj5A$NM}2r$,4V0c$C$F$$$k2DG=@-$,$G$F$-$^$7$?!#(B
> $BKM$O(BDCL$B$r<!$N$h$&$KM}2r$7$F$$$^$7$?!#(B
> 
>   DCL: Double-Checked Locking
> 
>   $B0UL#(B:
>   $B%^%k%A%9%l%C%I4D6-$K$*$1$kCY1d=i4|2=J}K!!#C<E*$K8@$&$H(B
>   $B%a%=%C%IFb$N(Bsynchrinized$B@a$N$3$H!#(B
> 
>   $B8zG=(B:
>   $B9=C[;~$K@8@.=hM}$r=8Cf$5$;$J$$$GCY1d=hM}$r9T$$9=C[=hM}(B
>   $B;~$N=8Cf2=$rHr$1$k!#(B
> 
>   $BMxMQNc(B:
>   $B%2%C%?!<%a%=%C%I$d%7%s%0%k%H%s%/%i%9$K$*$1$k@8@.%a%=%C(B
>   $B%I$J$I!#(B
> 
> DCL$B$OC<E*$K$O(BJava$B$G$O%a%=%C%IFb$N(Bsynchrinized$B$@$H;W$C$F$$$?(B
> $B$N$G$9$,!"Bg@P$5$s$N$4;XE&$+$i$_$^$9$K!"$3$l$O4V0c$C$F$$$k(B
> $B$_$?$$$G$9$M!#(B
> DCL$B$H$O2?$G$7$g$&$+(B? (DCL$B<+BN$,IT@5$J%"%k%4%j%:%`(B?)

A. synchronized Helper getHelper() { /* $B%a%=%C%IK\BN(B */ }
B. Helper getHelper() { synchronized (this) { /* $B%a%=%C%IK\BN(B */ } }

A$B$H(BB$B$OA4$/F1$80UL#$G$9!#(B
$B$H$$$&$h$j!"(BB$B$N>JN,7A$,(BA$B$G$"$k$H8@$C$?$[$&$,$o$+$j$d$9$$$G$7$g$&$+!#(B
$B$G$9$+$i!"%a%=%C%IFb$K(Bsynchrinized$B%V%m%C%/$r=q$$$F$b(B
$B$A$c$s$H%m%C%/=hM}$,9T$J$o$l$^$9!#(B

$BNc$($P(B
---
class Foo {
   private Helper helper = null;
   public synchronized Helper getHelper() {
      if (helper == null) {
         helper = new Helper();
      }
      return helper;
   }
   // other functions and members...
}
---
$B$O!"0J2<$N%3!<%I$HF1Ey$G$9!#(B
---
class Foo {
   private Helper helper = null;
   public Helper getHelper() {
      synchronized (this) {
         if (helper == null) {
            helper = new Helper();
         }
         return helper;
      }
   }
   // other functions and members...
}
---
$B$I$A$i$N%3!<%I$b(BJMM$B>e$GLdBj$J$/F0:n$9$k$3$H$,J]>Z$5$l$F$*$j!"(B
$B@5$7$/%$%s%9%?%s%9$NCY1d@8@.$r9T$J$&$3$H$,$G$-$^$9!#(B

$B$5$F!"$3$N$^$^$@$H(BgetHelper$B%a%=%C%I$r8F$V$?$S$K(B
synchronized$B$K$h$k%m%C%/$,9T$J$o$l$k$N$,>/!95$$K$J$j$^$9!#(B
$B<B:]!"(B2$B2sL\0J9_$N8F$S=P$7$G$OC1$K(B return helper; $B$,<B9T$5$l$k(B
$B$@$1$J$N$G!"(Bsynchronized$B%V%m%C%/$,L5BL$K46$8$^$9!#(B

$B$=$3$G!"(Bhelper == null$B$+$I$&$+$NH=Dj$r%m%C%/$N3MF@A0$H8e$N(B
2$B2s9T$J$&$h$&$K$7$F!"ITMW$J(B($B$h$&$K8+$($k(B)synchronized$B%V%m%C%/$,(B
$BKh2s<B9T$5$l$k$3$H$N$J$$$h$&$K$7$F$_$^$9!#(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$3$l$,(B "Double-Checked" Locking $B$H8F$P$l$k=j0J$G$9!#(B

Double-Checked Locking $B$O!"(Bsynchronized$B%V%m%C%/$K$h$j(B
$B%$%s%9%?%s%9$N@8@.$,3N<B$K(B1$B2s$@$19T$J$o$l$k$3$H$rJ]>Z$7!"(B
$B$+$D%$%s%9%?%s%9$,@8@.$5$l$?8e$O(Bsynchronized$B%V%m%C%/$r(B
$B2sHr$9$k$3$H$G%m%C%/$N%*!<%P!<%X%C%I$r8:$i$9$H$$$&(B
$BAG@2$i$7$$%"%k%4%j%:%`$N$h$&$K;W$($^$9!#(B

$B$7$+$7!"$3$N(B Double-Checked Locking $B$,K\Ev$O@5$7$/F0:n$7$J$$(B
$B%"%k%4%j%:%`$G$"$k$3$H$O!"(B[java 126] $B$G>R2p$7$?%Z!<%8$G(B
$B=R$Y$i$l$F$$$kDL$j$G$9!#(B

$B$3$N!"0l8+4qL/$K$b;W$($k(B Java Memory Model $B$N5sF0$K$D$$$F$O!"(B
Doug Lea $B$N(B "Concurrent Programming in Java" $B$G$b(B
$B$b$A$m$s<h$j>e$2$i$l$F$$$^$9!#(B
$B$=$N0lIt$O0J2<$N%Z!<%8$G$b8+$k$3$H$,$G$-$^$9!#(B
http://gee.cs.oswego.edu/dl/cpj/jmm.html

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