URLStreamHandler.getHostAddress() performance

Wang Weijun weijun.wang at oracle.com
Tue Nov 25 14:13:10 UTC 2014


> On Nov 25, 2014, at 20:55, Tom Hawtin <tom.hawtin at oracle.com> wrote:
> 
> 
> 
> On 25/11/2014 12:02, Wang Weijun wrote:
>> I am benchmarking security manager and notice this
>> 
>> protected synchronized InetAddress getHostAddress(URL u) {
>> [...]
>> 
>> Is there any reason why the method is synchronized? Why not simply "synchronized (u)"?
> 
> Synchronizing on a public object is usually a bad idea. For instance Thread.join has had some interesting interactions with non-Java library code, and AFAIK that wasn't sprung in an update.
> 
> If the address resolution is not pinned, then unsynchonised access could result in the hostAddress changing, which is bad. However, it seems the major useful effect is to stop a large number of parallel DNS lookups for the same address.

This sounds reasonable. Otherwise I cannot imagine why the calculation needs be taken out of URL class.

> Neither InetAddress nor DNSNameService does not appear to do that itself, though I've not looked deeply into the mechanism.
> 
> So, I would suggest a lock/compare-and-set for just the write to the previously null URL.hostAddress, and locking based on the value of URL.getHost (don't synchronise on String (that'd be a little like synchronising on URL!)!). There's probably several places in the Java library doing something similar with Maps and Futures.

Shall we encapsulate all of these in a new java.net.Host class?

--Max

> 
> Tom



More information about the security-dev mailing list