From owner-java@jp.FreeBSD.org Fri Jul 19 16:35:45 2002
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) id g6J7ZjE97657;
	Fri, 19 Jul 2002 16:35:45 +0900 (JST)
	(envelope-from owner-java@jp.FreeBSD.org)
Received: from ongs.co.jp (ns.ongs.co.jp [202.216.232.58])
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) with SMTP/inet id g6J7Zin97589
	for <java@jp.FreeBSD.org>; Fri, 19 Jul 2002 16:35:44 +0900 (JST)
	(envelope-from daichi@jp.freebsd.org)
Received: (qmail 50642 invoked from network); 19 Jul 2002 07:32:35 -0000
Received: from unknown (HELO parancell.ongs.co.jp) (202.216.232.62)
  by ns.ongs.co.jp with SMTP; 19 Jul 2002 07:32:35 -0000
Date: Fri, 19 Jul 2002 16:36:14 +0900
From: daichi <daichi@jp.FreeBSD.org>
To: java@jp.FreeBSD.org
Message-Id: <20020719163614.7ec433a8.daichi@jp.freebsd.org>
In-Reply-To: <20020719.013920.74753632.yamasa@ec.catv.ne.jp>
References: <sqbptxl5atc.wl@nue.mac.com>
	<20020719.013920.74753632.yamasa@ec.catv.ne.jp>
Organization: ONGS Inc.
X-Mailer: Sylpheed version 0.8.0 (GTK+ 1.2.10; i386-portbld-freebsd4.6)
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 132
Subject: [java 132] Re: Java Memory Model
Errors-To: owner-java@jp.FreeBSD.org
Sender: owner-java@jp.FreeBSD.org
X-Originator: daichi@jp.FreeBSD.org
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+020717

$BBgCO$G$9!#(B

> $BBg@P$G$9!#(B
(snip)
> $B>R2p$5$l$k$3$H$,$"$k(B "Double-Checked Locking" $B$H$$$&9=J8$,(B
> $B<B$O4V0c$C$F$$$k$H$$$&5-;v$G$7$g$&$+!#(B
> 
> http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-double.html
> http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
> 
> $B;d$b$3$N5-;v$r=i$a$FFI$s$@$H$-$O!"%9%l%C%I%W%m%0%i%_%s%0$N1|?<$5$K(B
> $B46?4$9$k$P$+$j$G$7$?!#(B

$BFs$DL\$N$N(BURL$B$N2r@bJ8=q$K$"$k!V(BIt will work for 32-bit primitive
values$B!W$N$H$3$m(B

  Although the double-checked locking idiom cannot be used for 
  references to objects, it can work for 32-bit primitive values 
  (e.g., int's or float's). Note that it does not work for long's 
  or double's, since unsynchronized reads/writes of 64-bit 
  primitives are not guaranteed to be atomic.

  // Correct Double-Checked Locking for 32-bit primitives
  class Foo { 
    private int cachedHashCode = 0;
    public int hashCode() {
      int h = cachedHashCode;
      if (h == 0) 
      synchronized(this) {
        if (cachedHashCode != 0) return cachedHashCode;
        h = computeHashCode();
        cachedHashCode = h;
        }
      return h;
      }
    // other functions and members...
    }

$B$,$A$c$s$HF0$/$C$F$$$&$H$3$m$N$/$@$j$,M}2r$G$-$J$$$C$9!#$3$N(B
$BItJ,(B

      synchronized(this) {
        if (cachedHashCode != 0) return cachedHashCode;

$B$GFs$D$N%9%l%C%I$,(Bsynchronized$B@aFb$KF~$C$F$-$F$bJRJ}$rCF$$$F(B
$B$$$k$H$$$&$3$H$G$7$g$&$+!#(B32-bit primitive$B$K8B$k$H$$$&$N$O$I(B
$B$&$$$&$3$H$+$7$i!#(B
# $B$3$N%3!<%I$r%Y!<%9$K$7$?$i0l1~LdBj$r2sHr$G$-$k(BDCL$B$J5-=R$,$G(B
# $B$-$k$3$H$K$J$k$N$+$J!#(B

P.S.
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

--
Daichi GOTO
    http://www.ongs.net/daichi, daichi@jp.freebsd.org
