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

Aleksey Shipilev aleksey.shipilev at oracle.com
Wed Jun 26 07:05:10 UTC 2013


Yes, like that.

-Aleksey

On 26.06.2013, at 10:53, Dmitry Nadezhin <dmitry.nadezhin at gmail.com> wrote:

>> 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