Author: ecki Date: Wed Sep 23 20:39:32 2015 New Revision: 1704932 URL: http://svn.apache.org/viewvc?rev=1704932&view=rev Log: [VFS-480] Avoid leaks by startng SoftRefsReleaseThread more reliable.
Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/cache/SoftRefFilesCache.java commons/proper/vfs/trunk/src/changes/changes.xml Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/cache/SoftRefFilesCache.java URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/cache/SoftRefFilesCache.java?rev=1704932&r1=1704931&r2=1704932&view=diff ============================================================================== --- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/cache/SoftRefFilesCache.java (original) +++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/cache/SoftRefFilesCache.java Wed Sep 23 20:39:32 2015 @@ -55,8 +55,7 @@ public class SoftRefFilesCache extends A new HashMap<Reference<FileObject>, FileSystemAndNameKey>(100); private final ReferenceQueue<FileObject> refQueue = new ReferenceQueue<FileObject>(); - private final AtomicReference<SoftRefReleaseThread> softRefReleaseThread = - new AtomicReference<SoftRefReleaseThread>(); + private volatile SoftRefReleaseThread softRefReleaseThread = null; // @GuardedBy("lock") private final Lock lock = new ReentrantLock(); @@ -122,31 +121,33 @@ public class SoftRefFilesCache extends A private void startThread() { - Thread thread; - SoftRefReleaseThread newThread; - do + // Double Checked Locking is allowed when volatile + if (softRefReleaseThread != null) { - newThread = null; - thread = softRefReleaseThread.get(); - if (thread != null) + return; + } + + synchronized (lock) + { + if (softRefReleaseThread == null) { - break; + softRefReleaseThread = new SoftRefReleaseThread(); + softRefReleaseThread.start(); } - newThread = new SoftRefReleaseThread(); - } while (softRefReleaseThread.compareAndSet(null, newThread)); - if (newThread != null) - { - newThread.start(); } } private void endThread() { - final SoftRefReleaseThread thread = softRefReleaseThread.getAndSet(null); - if (thread != null) + synchronized (lock) { - thread.requestEnd = true; - thread.interrupt(); + final SoftRefReleaseThread thread = softRefReleaseThread; + softRefReleaseThread = null; + if (thread != null) + { + thread.requestEnd = true; + thread.interrupt(); + } } } Modified: commons/proper/vfs/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/src/changes/changes.xml?rev=1704932&r1=1704931&r2=1704932&view=diff ============================================================================== --- commons/proper/vfs/trunk/src/changes/changes.xml (original) +++ commons/proper/vfs/trunk/src/changes/changes.xml Wed Sep 23 20:39:32 2015 @@ -26,6 +26,9 @@ <!-- <action issue="VFS-443" dev="ggregory" type="update" due-to="nickallen"> --> <!-- [Local] Need an easy way to convert from a FileObject to a File. --> <!-- </action> --> + <action issue="VFS-480" dev="ecki" type="fix"> + Make startup of SoftRefsFileCache cleaner thread work and less racy to avoid leaks. + </action> <action issue="VFS-549" dev="ecki" type="fix"> Use File.seperator instead of getProperty("file.separator"). </action>