RFR 4641897: Faster string conversion of large integers
Aleksey Shipilev
aleksey.shipilev at oracle.com
Sat Jun 22 10:54:26 UTC 2013
On 06/22/2013 02:50 PM, Aleksey Shipilev wrote:
> On 06/22/2013 08:06 AM, Dmitry Nadezhin wrote:
>> Alexey,
>>
>> Each possible radix has its cacheLine in the cache.
>>
>> Cache contents looks like
>> BigInteger[][] powerCache = new BigInteger[37] {
>> /*0*/ null,
>> /*1*/ null,
>> /*2*/ new BigInteger[] { 2, 4, 16, 256, 32768, ... },
>> /*3*/ new BigInteger[] { 3, 9, 81, ... },
>> /*4*/ new BigInteger[] { 4, 16, 256, ... }
>> /*5*/ new BigInteger[] { 5, 25, 625, ... },
>> /*6*/ new BigInteger[] { 6 },
>> /*7*/ new BigInteger[] { 7 },
>> . . .
>> /*36*/ new BigInteger[] { 36 }
>> };
>>
>> Is there an idiom for a list/array of volatile references ?
>
> AtomicReferenceArray is your friend there. Although I'm not sure why you
> need the list of volatile references in this case. Placing volatile to
> the root reference resolves the race.
>
>> I am not sure that such naive code works:
>> volatile BigInteger[][] powerCache = ..,
>
> Why wouldn't it work?
>
> volatile T[][] cache;
>
> T[] get(int index) {
> T[][] lc = cache;
> if (index >= lc.length) { // need resizing
> lc = generateNew(index << 1);
> cache = lc;
> }
> return lc[index];
> }
>
> If you need to populate the 2nd level, then you have to have the final
> volatile write to the $cache. The corresponding $cache volatile read
> makes the update on 2nd level visible.
>
> T get(int index1, index2) {
> T[][] lc = cache;
> if (index1 >= lc.length) { // needs resizing
> lc = generateNewT2(index1 << 1);
> cache = lc;
> }
> T[] lt = lc[index2];
> if (index2 >= lt.length) { // needs resizing
> lt = generateNewT1(index2 << 1);
> lc[index2] = lt;
> cache = lc; // publish
> }
> return lt[index2];
> }
Of course, there is a series of typos. Should instead be:
T get(int index1, index2) {
T[][] lc = cache;
if (index1 >= lc.length) { // needs resizing
lc = <generate_new_T[][]_of_size>((index1 << 1) + 1);
cache = lc;
}
T[] lt = lc[index2];
if (index2 >= lt.length) { // needs resizing
lt = <generate_new_T[]_of_size>((index2 << 1) + 1);
lc[index1] = lt;
cache = lc; // publish
}
return lt[index2];
}
-Aleksey.
More information about the core-libs-dev
mailing list