RFR 8017540: Improve multi-threaded contention behavior of BigInteger.toString() radix conversion cache (original) (raw)
Aleksey Shipilev aleksey.shipilev at oracle.com
Wed Jun 26 07:05:10 UTC 2013
- Previous message: RFR 8017540: Improve multi-threaded contention behavior of BigInteger.toString() radix conversion cache
- Next message: RFR 8017540: Improve multi-threaded contention behavior of BigInteger.toString() radix conversion cache
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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.
- Previous message: RFR 8017540: Improve multi-threaded contention behavior of BigInteger.toString() radix conversion cache
- Next message: RFR 8017540: Improve multi-threaded contention behavior of BigInteger.toString() radix conversion cache
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]