For values in VALID_CACHE in regex factory, I'd just use an Object instead of 
String for VALID_REGEXP: declare WeakHashMap<String, Object> and use "private 
static final Object VALID_REGEXP = new Object()". 

That's the lesser problem. A larger problem is that I think - since this is 
static - it's possible for the map to be accessed on multiple threads, and 
WeakHashMap is not threadsafe, so you'll need to synchronize around it, which 
may or may not take away the performance benefits. You can't avoid it, as 
concurrent puts can corrupt the map.

Yet another issue is that the keys are Strings - weak reachability is a 
referential property, and strings have value semantics. If the exact String 
object being put in the map gets GCd (it is not itself interned etc.) then 
entries can seemingly mysteriously disappear. This won't cause any trouble 
correctness wise, of course, but it could be surprising. (E.g. you might still 
end up validating the same string.)

Likewise, you need to synchronize around INTERNAL_TYPE_CACHE in Type too. The 
other issues I mentioned with VALID_CACHE fortunately don't apply here: I don't 
think synchronization will affect the performance benefit much, as it pays off 
better, because you're doing one lookup per type and then cache the result. 
Also, Class objects have identity equality semantics, so they won't 
unexpectedly vanish from the map either.

So, at the least, you need to:
- add one synchronization block around the if(get) { ... put } operation 
sequence for both weak hash maps

before I can +1 this.

I'd also like it if you used:
- a "new Object()" instead of "valid".intern() for VALID_CACHE values
- containsKey(key) instead of get(key) == null with VALID_CACHE.
(these are just niceties)

Attila.


On Sep 29, 2014, at 4:36 PM, Marcus Lagergren <[email protected]> 
wrote:

> Can I get reviews here, please. Attila? Other people who may be at JavaOne? 
> Jim?
> 
> /M
> 
> On 28 Sep 2014, at 18:30, Marcus Lagergren <[email protected]> 
> wrote:
> 
>> Some very trivial changes / caches to parser logic, regexp engine and type 
>> descriptor calculation that had mesurable and significant impact on avatar 
>> startup.
>> 
>> https://bugs.openjdk.java.net/browse/JDK-8059321
>> Webrev is here: http://cr.openjdk.java.net/~lagergren/8059321/
>> 
>> /M
>> 
> 

Reply via email to