--- jsr166/src/main/java/util/Random.java 2005/11/06 07:47:51 1.12 +++ jsr166/src/main/java/util/Random.java 2007/01/07 07:38:27 1.18 @@ -1,13 +1,14 @@ /* * %W% %E% * - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.util; import java.io.*; import java.util.concurrent.atomic.AtomicLong; +import sun.misc.Unsafe; /** * An instance of this class is used to generate a stream of @@ -47,7 +48,7 @@ class Random implements java.io.Serializ * * @serial */ - private AtomicLong seed; + private final AtomicLong seed; private final static long multiplier = 0x5DEECE66DL; private final static long addend = 0xBL; @@ -135,7 +136,7 @@ class Random implements java.io.Serializ do { oldseed = seed.get(); nextseed = (oldseed * multiplier + addend) & mask; - } while (!seed.compareAndSet(oldseed, nextseed)); + } while (!seed.weakCompareAndSet(oldseed, nextseed)); return (int)(nextseed >>> (48 - bits)); } @@ -492,7 +493,7 @@ class Random implements java.io.Serializ if (seedVal < 0) throw new java.io.StreamCorruptedException( "Random: invalid seed"); - seed = new AtomicLong(seedVal); + resetSeed(seedVal); nextNextGaussian = fields.get("nextNextGaussian", 0.0); haveNextNextGaussian = fields.get("haveNextNextGaussian", false); } @@ -515,4 +516,16 @@ class Random implements java.io.Serializ s.writeFields(); } + // Support for resetting seed while deserializing + private static final Unsafe unsafe = Unsafe.getUnsafe(); + private static final long seedOffset; + static { + try { + seedOffset = unsafe.objectFieldOffset + (Random.class.getDeclaredField("seed")); + } catch (Exception ex) { throw new Error(ex); } + } + private void resetSeed(long seedVal) { + unsafe.putObjectVolatile(this, seedOffset, new AtomicLong(seedVal)); + } }