2012/12/8 Caldarale, Charles R <[email protected]>:
>> From: Christopher Schultz [mailto:[email protected]]
>> Subject: Re: svn commit: r1417194 - in
>> /tomcat/trunk/java/org/apache/tomcat/util/buf: ByteChunk.java CharChunk.java
>
>> On 12/4/12 4:21 PM, [email protected] wrote:
>> > + private int hashCode=0;
>> > + // did we compute the hashcode ?
>> > + private boolean hasHashCode = false;
>
>> Should hashCode and hasHashCode be volatile?
>
> Yes, to insure program order is followed; otherwise there's no guarantee that
> hashCode and hasHashCode are written in the required sequence.
1) I would prefer a single volatile field rather than dealing with two
volatile ones.
E.g. make sure that hash() never returns 0 and use that as a flag.
If it is a single field, there is no need to make it volatile,
likewise the buff/start/end fields are not volatile.
2) I see no need for the public "hash()" method here. The MessageBytes
class can be changed to call hashCode().
>> In fact, there seems to be much more code in there than necessary. Why not:
>
>> > + public int hashCode() {
>> > + if (hasHashCode) {
>> > + return hashCode;
>> > + }
>> > + hashCode = hash();
>> > + hasHashCode = true;
>> > + return hashCode;
>
> Or:
>
> public int hashCode() {
> if (!hasHashCode) {
> hashCode = hash();
> hasHashCode = true;
> }
> return hashCode;
> }
>
Best regards,
Konstantin Kolinko
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]