diff options
author | Jonathan Nieder <jrn@google.com> | 2019-01-14 10:48:06 -0800 |
---|---|---|
committer | Jonathan Nieder <jrn@google.com> | 2019-01-14 10:55:28 -0800 |
commit | 1131f35cd1904d42fe86222c46212a3fb89b5da8 (patch) | |
tree | 674d8b7601a8d03da023dafcf9d2d60623ba8510 /org.eclipse.jgit | |
parent | 5f355ed4ad60118eb4331f0ea5b018d3fa16070b (diff) | |
download | jgit-1131f35cd1904d42fe86222c46212a3fb89b5da8.tar.gz jgit-1131f35cd1904d42fe86222c46212a3fb89b5da8.zip |
dfs: Remove synchronization in BlockBasedFile#LazyChannel
As explained in 'The "Double-Checked Locking is Broken"
Declaration'[*], Java's memory model does not support double-checked
locking:
class LazyReadableChannel {
private ReachableChannel rc = null;
public ReadableChannel get() {
if (rc == null) {
synchronized (this) {
if (rc == null) {
rc = new ReadableChannel();
}
}
}
return rc;
}
}
With JDK 5 and newer, there is a formal memory model that ensures this
works if "rc" is volatile, but it is still not thread-safe without
that.
Fortunately, this ReadableChannelSupplier is never passed between
threads, so it does not need to be thread-safe. Simplify by removing
the synchronization.
[*] https://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Change-Id: I0698ee6618d734fc129dd4f63fc047c1c17c94a9
Signed-off-by: Jonathan Nieder <jrn@google.com>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BlockBasedFile.java | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BlockBasedFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BlockBasedFile.java index 4d14742440..4e4a26f4e6 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BlockBasedFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/BlockBasedFile.java @@ -213,7 +213,7 @@ abstract class BlockBasedFile { private final DfsPackDescription desc; private final PackExt ext; - private ReadableChannel rc = null; + private ReadableChannel rc; LazyChannel(DfsReader ctx, DfsPackDescription desc, PackExt ext) { this.ctx = ctx; @@ -224,11 +224,7 @@ abstract class BlockBasedFile { @Override public ReadableChannel get() throws IOException { if (rc == null) { - synchronized (this) { - if (rc == null) { - rc = ctx.db.openFile(desc, ext); - } - } + rc = ctx.db.openFile(desc, ext); } return rc; } |