You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by ka...@apache.org on 2006/08/15 16:20:50 UTC
svn commit: r431603 -
/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ConsistencyToken.java
Author: kahatlen
Date: Tue Aug 15 07:20:46 2006
New Revision: 431603
URL: http://svn.apache.org/viewvc?rev=431603&view=rev
Log:
DERBY-1688: ConsistencyToken.hashCode() is not thread safe
Rewrite the method to use a thread-safe approach as suggested by The
"Double-Checked Locking is Broken" Declaration.
Modified:
db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ConsistencyToken.java
Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ConsistencyToken.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ConsistencyToken.java?rev=431603&r1=431602&r2=431603&view=diff
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ConsistencyToken.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ConsistencyToken.java Tue Aug 15 07:20:46 2006
@@ -70,13 +70,23 @@
* @return hash code
*/
public int hashCode() {
- if (hash == 0) {
+ // ConsistencyToken objects might be kept for a long time and are
+ // frequently used as keys in hash tables. Therefore, it is a good idea
+ // to cache their hash codes.
+ int h = hash;
+ if (h == 0) {
+ // The hash code has not been calculated yet (or perhaps the hash
+ // code actually is 0). Calculate a new one and cache it. No
+ // synchronization is needed since reads and writes of 32-bit
+ // primitive values are guaranteed to be atomic. See The
+ // "Double-Checked Locking is Broken" Declaration for details.
int len = bytes.length;
for (int i = 0; i < len; ++i) {
- hash ^= bytes[i];
+ h ^= bytes[i];
}
+ hash = h;
}
- return hash;
+ return h;
}
/**