Skip to content

Commit b676705

Browse files
author
ribeaud
committedNov 1, 2018
'ensureDataLoaded' should NOT always use the write lock
1 parent b4ac574 commit b676705

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed
 

‎pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<modelVersion>4.0.0</modelVersion>
66
<groupId>org.apache.camel</groupId>
77
<artifactId>camel-data-provider</artifactId>
8-
<version>1.0.5</version>
8+
<version>1.0.6</version>
99

1010
<packaging>jar</packaging>
1111

‎src/main/java/org/apache/camel/component/dataprovider/LazyDataProvider.java

+18-9
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public abstract class LazyDataProvider<T> implements IDataProvider<T> {
2020
private final ReentrantReadWriteLock dataLock = new ReentrantReadWriteLock();
2121
private final Lock readDataLock = dataLock.readLock();
2222
private final Lock writeDataLock = dataLock.writeLock();
23+
private volatile boolean dataLoaded;
2324

2425
private ImmutableList<T> data;
2526

@@ -34,16 +35,24 @@ public abstract class LazyDataProvider<T> implements IDataProvider<T> {
3435
public abstract Iterable<T> loadData();
3536

3637
private void ensureDataLoaded() {
37-
LockUtils.runWithLock(writeDataLock, () -> {
38-
if (data == null) {
39-
Iterable<T> data = loadData();
40-
if (data instanceof ImmutableList) {
41-
this.data = (ImmutableList<T>) data;
42-
} else {
43-
this.data = ImmutableList.copyOf(data);
44-
}
38+
readDataLock.lock();
39+
try {
40+
if (dataLoaded == false) {
41+
readDataLock.unlock();
42+
LockUtils.runWithLock(this.writeDataLock, () -> {
43+
Iterable<T> data = this.loadData();
44+
if (data instanceof ImmutableList) {
45+
this.data = (ImmutableList) data;
46+
} else {
47+
this.data = ImmutableList.copyOf(data);
48+
}
49+
dataLoaded = true;
50+
readDataLock.lock();
51+
});
4552
}
46-
});
53+
} finally {
54+
readDataLock.unlock();
55+
}
4756
}
4857

4958
@Override

0 commit comments

Comments
 (0)
Please sign in to comment.