diff --git a/build.xml b/build.xml
index 489379c659..df25d59518 100644
--- a/build.xml
+++ b/build.xml
@@ -1240,6 +1240,7 @@ cd ..
+
diff --git a/lib/native/linux-x86-64.jar b/lib/native/linux-x86-64.jar
index d659f63ac1..653423182f 100644
Binary files a/lib/native/linux-x86-64.jar and b/lib/native/linux-x86-64.jar differ
diff --git a/src/com/sun/jna/internal/Cleaner.java b/src/com/sun/jna/internal/Cleaner.java
index a2095937fc..5dff307da0 100644
--- a/src/com/sun/jna/internal/Cleaner.java
+++ b/src/com/sun/jna/internal/Cleaner.java
@@ -27,6 +27,12 @@
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -44,65 +50,90 @@ public static Cleaner getCleaner() {
return INSTANCE;
}
+ // Guard for trackedObjects and cleanerThread. The readlock is utilized when
+ // the trackedObjects are manipulated, the writelock protectes starting and
+ // stopping the CleanerThread
+ private final ReadWriteLock cleanerThreadLock = new ReentrantReadWriteLock();
private final ReferenceQueue