RFR 8017540: Improve multi-threaded contention behavior of BigInteger.toString() radix conversion cache

Dmitry Nadezhin dmitry.nadezhin at gmail.com
Wed Jun 26 06:53:24 UTC 2013


> We could check for the existing cacheLine.length right before installing
the new one

Do you mean something like this ?

BigInteger getRadixConversionCache(int radix, int exponent) {
  BigInteger[] cacheLine = powerCache[radix]; // volatile read
  if (exponent < cacheLine.length)
     return cacheLine[exponent];

  int oldLength = cacheLine.length;
  cacheLine = Arrays.copyOf(cacheLine, exponent + 1);
  for (int i = oldLength; i < exponent + 1; i++)
     cacheLine[i] = cacheLine[i - 1].square();

  if (exponent >= powerCache[radix].length) { // volatile read again
    BigInteger[][] pc = Arrays.copyOf(powerCache);
    pc[radix] = cacheLine;
    powerCache = pc; // volatile write, publish
  }
  return cacheLine[exponent];
 }



On Wed, Jun 26, 2013 at 10:31 AM, Aleksey Shipilev <
aleksey.shipilev at oracle.com> wrote:

> On 26.06.2013, at 7:31, Dmitry Nadezhin <dmitry.nadezhin at gmail.com> wrote:
>
> > We have two versions after private discussion with Aleksey.
> >
> > BigInteger getRadixConversionCache(int radix, int exponent) {
> >  BigInteger[][] pc = powerCache; // volatile read
> >  BigInteger[] cacheLine = pc[radix];
> >  if (exponent < cacheLine.length)
> >      return cacheLine[exponent];
> >
> >  int oldSize = cacheLine.length;
> >  cacheLine = Arrays.copyOf(cacheLine, exponent + 1);
> >  for (int i = oldSize; i < exponent + 1; i++)
> >      cacheLine[i] = cacheLine[i - 1].square();
> >
> >  pc = Arrays.copyOf(powerCache);
> >  pc[radix] = cacheLine;
> >  powerCache = pc; // volatile write, publish
> >  return cacheLine[exponent];
> > }
>
> Thanks, I like this version a lot better. We could check for the existing
> cacheLine.length right before installing the new one, so the opportunity to
> overwrite larger cacheLine would be minimal, but I do think the probability
> of unlucky timing is very low, and the argument is moot :) Let's keep it
> simple.
>
> -Aleksey.



More information about the core-libs-dev mailing list