Author: j16sdiz
Date: 2008-06-13 12:23:24 +0000 (Fri, 13 Jun 2008)
New Revision: 20291

Modified:
   branches/saltedhashstore/freenet/src/freenet/support/BloomFilter.java
Log:
use java.util.concurrent.locks.ReadWriteLock for BloomFilter


Modified: branches/saltedhashstore/freenet/src/freenet/support/BloomFilter.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/support/BloomFilter.java       
2008-06-13 12:23:03 UTC (rev 20290)
+++ branches/saltedhashstore/freenet/src/freenet/support/BloomFilter.java       
2008-06-13 12:23:24 UTC (rev 20291)
@@ -10,18 +10,20 @@
 import java.nio.MappedByteBuffer;
 import java.nio.channels.FileChannel.MapMode;
 import java.security.MessageDigest;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;

 import freenet.crypt.SHA256;

 /**
  * @author sdiz
  */
-//TODO use ReadWriteLock once we move to java 5
 public class BloomFilter {
        protected ByteBuffer filter;
        protected final int length;
        /** Number of hash functions */
        protected final int k;
+       private ReadWriteLock lock = new ReentrantReadWriteLock();

        /**
         * Constructor
@@ -61,9 +63,12 @@

        public void updateFilter(byte[] key, boolean sync) {
                int[] hashes = getHashes(key);
-               synchronized (this) {
+               lock.writeLock().lock();
+               try {
                        for (int i = 0; i < k; i++)
                                setBit(hashes[i]);
+               } finally {
+                       lock.writeLock().unlock();
                }
                if (sync)
                        force();
@@ -71,12 +76,15 @@

        public boolean checkFilter(byte[] key) {
                int[] hashes = getHashes(key);
-               synchronized (this) {
+               lock.readLock().lock();
+               try {
                        for (int i = 0; i < k; i++)
                                if (!getBit(hashes[i]))
                                        return false;
-                       return true;
+               } finally {
+                       lock.readLock().unlock();
                }
+               return true;
        }

        private int[] getHashes(byte[] key) {
@@ -118,6 +126,7 @@
                }
        }

+       @Override
        protected void finalize() {
                if (filter != null) {
                        force();


Reply via email to