Skip to content

Commit 1e9eb69

Browse files
committed
Use Lock instead synchronized
1 parent 8ee1ebf commit 1e9eb69

File tree

13 files changed

+444
-169
lines changed

13 files changed

+444
-169
lines changed

src/main/java/org/apache/ibatis/cache/decorators/SoftCache.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.LinkedList;
2222

2323
import org.apache.ibatis.cache.Cache;
24+
import org.apache.ibatis.util.LockKit;
2425

2526
/**
2627
* Soft Reference cache decorator.
@@ -74,11 +75,15 @@ public Object getObject(Object key) {
7475
delegate.removeObject(key);
7576
} else {
7677
// See #586 (and #335) modifications need more than a read lock
77-
synchronized (hardLinksToAvoidGarbageCollection) {
78+
LockKit.ReentrantLock lock = LockKit.obtainLock(hardLinksToAvoidGarbageCollection);
79+
lock.lock();
80+
try {
7881
hardLinksToAvoidGarbageCollection.addFirst(result);
7982
if (hardLinksToAvoidGarbageCollection.size() > numberOfHardLinks) {
8083
hardLinksToAvoidGarbageCollection.removeLast();
8184
}
85+
} finally {
86+
lock.unlock();
8287
}
8388
}
8489
}
@@ -95,8 +100,12 @@ public Object removeObject(Object key) {
95100

96101
@Override
97102
public void clear() {
98-
synchronized (hardLinksToAvoidGarbageCollection) {
103+
LockKit.ReentrantLock lock = LockKit.obtainLock(hardLinksToAvoidGarbageCollection);
104+
lock.lock();
105+
try {
99106
hardLinksToAvoidGarbageCollection.clear();
107+
} finally {
108+
lock.unlock();
100109
}
101110
removeGarbageCollectedItems();
102111
delegate.clear();

src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.java

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2022 the original author or authors.
2+
* Copyright 2009-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,13 +15,16 @@
1515
*/
1616
package org.apache.ibatis.cache.decorators;
1717

18+
import java.util.concurrent.locks.ReentrantReadWriteLock;
19+
1820
import org.apache.ibatis.cache.Cache;
1921

2022
/**
2123
* @author Clinton Begin
2224
*/
2325
public class SynchronizedCache implements Cache {
2426

27+
private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
2528
private final Cache delegate;
2629

2730
public SynchronizedCache(Cache delegate) {
@@ -34,28 +37,53 @@ public String getId() {
3437
}
3538

3639
@Override
37-
public synchronized int getSize() {
38-
return delegate.getSize();
40+
public int getSize() {
41+
readWriteLock.readLock().lock();
42+
try {
43+
return delegate.getSize();
44+
} finally {
45+
readWriteLock.readLock().unlock();
46+
}
3947
}
4048

4149
@Override
42-
public synchronized void putObject(Object key, Object object) {
43-
delegate.putObject(key, object);
50+
public void putObject(Object key, Object object) {
51+
readWriteLock.writeLock().lock();
52+
try {
53+
delegate.putObject(key, object);
54+
} finally {
55+
readWriteLock.writeLock().unlock();
56+
}
4457
}
4558

4659
@Override
47-
public synchronized Object getObject(Object key) {
48-
return delegate.getObject(key);
60+
public Object getObject(Object key) {
61+
readWriteLock.readLock().lock();
62+
try {
63+
return delegate.getObject(key);
64+
} finally {
65+
readWriteLock.readLock().unlock();
66+
}
4967
}
5068

5169
@Override
52-
public synchronized Object removeObject(Object key) {
53-
return delegate.removeObject(key);
70+
public Object removeObject(Object key) {
71+
readWriteLock.writeLock().lock();
72+
try {
73+
return delegate.removeObject(key);
74+
} finally {
75+
readWriteLock.writeLock().unlock();
76+
}
5477
}
5578

5679
@Override
57-
public synchronized void clear() {
58-
delegate.clear();
80+
public void clear() {
81+
readWriteLock.writeLock().lock();
82+
try {
83+
delegate.clear();
84+
} finally {
85+
readWriteLock.writeLock().unlock();
86+
}
5987
}
6088

6189
@Override

src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.LinkedList;
2222

2323
import org.apache.ibatis.cache.Cache;
24+
import org.apache.ibatis.util.LockKit;
2425

2526
/**
2627
* Weak Reference cache decorator.
@@ -73,11 +74,15 @@ public Object getObject(Object key) {
7374
if (result == null) {
7475
delegate.removeObject(key);
7576
} else {
76-
synchronized (hardLinksToAvoidGarbageCollection) {
77+
LockKit.ReentrantLock lock = LockKit.obtainLock(hardLinksToAvoidGarbageCollection);
78+
lock.lock();
79+
try {
7780
hardLinksToAvoidGarbageCollection.addFirst(result);
7881
if (hardLinksToAvoidGarbageCollection.size() > numberOfHardLinks) {
7982
hardLinksToAvoidGarbageCollection.removeLast();
8083
}
84+
} finally {
85+
lock.unlock();
8186
}
8287
}
8388
}
@@ -94,8 +99,12 @@ public Object removeObject(Object key) {
9499

95100
@Override
96101
public void clear() {
97-
synchronized (hardLinksToAvoidGarbageCollection) {
102+
LockKit.ReentrantLock lock = LockKit.obtainLock(hardLinksToAvoidGarbageCollection);
103+
lock.lock();
104+
try {
98105
hardLinksToAvoidGarbageCollection.clear();
106+
} finally {
107+
lock.unlock();
99108
}
100109
removeGarbageCollectedItems();
101110
delegate.clear();

src/main/java/org/apache/ibatis/datasource/pooled/PoolState.java

Lines changed: 109 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@
1818
import java.util.ArrayList;
1919
import java.util.List;
2020

21+
import org.apache.ibatis.util.LockKit;
22+
2123
/**
2224
* @author Clinton Begin
2325
*/
2426
public class PoolState {
2527

28+
private final LockKit.ReentrantLock reentrantLock;
29+
2630
protected PooledDataSource dataSource;
2731

2832
protected final List<PooledConnection> idleConnections = new ArrayList<>();
@@ -38,79 +42,134 @@ public class PoolState {
3842

3943
public PoolState(PooledDataSource dataSource) {
4044
this.dataSource = dataSource;
45+
this.reentrantLock = LockKit.obtainLock(dataSource);
4146
}
4247

43-
public synchronized long getRequestCount() {
44-
return requestCount;
48+
public long getRequestCount() {
49+
reentrantLock.lock();
50+
try {
51+
return requestCount;
52+
} finally {
53+
reentrantLock.unlock();
54+
}
4555
}
4656

47-
public synchronized long getAverageRequestTime() {
48-
return requestCount == 0 ? 0 : accumulatedRequestTime / requestCount;
57+
public long getAverageRequestTime() {
58+
reentrantLock.lock();
59+
try {
60+
return requestCount == 0 ? 0 : accumulatedRequestTime / requestCount;
61+
} finally {
62+
reentrantLock.unlock();
63+
}
4964
}
5065

51-
public synchronized long getAverageWaitTime() {
52-
return hadToWaitCount == 0 ? 0 : accumulatedWaitTime / hadToWaitCount;
53-
66+
public long getAverageWaitTime() {
67+
reentrantLock.lock();
68+
try {
69+
return hadToWaitCount == 0 ? 0 : accumulatedWaitTime / hadToWaitCount;
70+
} finally {
71+
reentrantLock.unlock();
72+
}
5473
}
5574

56-
public synchronized long getHadToWaitCount() {
57-
return hadToWaitCount;
75+
public long getHadToWaitCount() {
76+
reentrantLock.lock();
77+
try {
78+
return hadToWaitCount;
79+
} finally {
80+
reentrantLock.unlock();
81+
}
5882
}
5983

60-
public synchronized long getBadConnectionCount() {
61-
return badConnectionCount;
84+
public long getBadConnectionCount() {
85+
reentrantLock.lock();
86+
try {
87+
return badConnectionCount;
88+
} finally {
89+
reentrantLock.unlock();
90+
}
6291
}
6392

64-
public synchronized long getClaimedOverdueConnectionCount() {
65-
return claimedOverdueConnectionCount;
93+
public long getClaimedOverdueConnectionCount() {
94+
reentrantLock.lock();
95+
try {
96+
return claimedOverdueConnectionCount;
97+
} finally {
98+
reentrantLock.unlock();
99+
}
66100
}
67101

68-
public synchronized long getAverageOverdueCheckoutTime() {
69-
return claimedOverdueConnectionCount == 0 ? 0
70-
: accumulatedCheckoutTimeOfOverdueConnections / claimedOverdueConnectionCount;
102+
public long getAverageOverdueCheckoutTime() {
103+
reentrantLock.lock();
104+
try {
105+
return claimedOverdueConnectionCount == 0 ? 0
106+
: accumulatedCheckoutTimeOfOverdueConnections / claimedOverdueConnectionCount;
107+
} finally {
108+
reentrantLock.unlock();
109+
}
71110
}
72111

73-
public synchronized long getAverageCheckoutTime() {
74-
return requestCount == 0 ? 0 : accumulatedCheckoutTime / requestCount;
112+
public long getAverageCheckoutTime() {
113+
reentrantLock.lock();
114+
try {
115+
return requestCount == 0 ? 0 : accumulatedCheckoutTime / requestCount;
116+
} finally {
117+
reentrantLock.unlock();
118+
}
75119
}
76120

77-
public synchronized int getIdleConnectionCount() {
78-
return idleConnections.size();
121+
public int getIdleConnectionCount() {
122+
reentrantLock.lock();
123+
try {
124+
return idleConnections.size();
125+
} finally {
126+
reentrantLock.unlock();
127+
}
79128
}
80129

81-
public synchronized int getActiveConnectionCount() {
82-
return activeConnections.size();
130+
public int getActiveConnectionCount() {
131+
reentrantLock.lock();
132+
try {
133+
return activeConnections.size();
134+
} finally {
135+
reentrantLock.unlock();
136+
}
83137
}
84138

85139
@Override
86-
public synchronized String toString() {
87-
StringBuilder builder = new StringBuilder();
88-
builder.append("\n===CONFIGURATION==============================================");
89-
builder.append("\n jdbcDriver ").append(dataSource.getDriver());
90-
builder.append("\n jdbcUrl ").append(dataSource.getUrl());
91-
builder.append("\n jdbcUsername ").append(dataSource.getUsername());
92-
builder.append("\n jdbcPassword ")
93-
.append(dataSource.getPassword() == null ? "NULL" : "************");
94-
builder.append("\n poolMaxActiveConnections ").append(dataSource.poolMaximumActiveConnections);
95-
builder.append("\n poolMaxIdleConnections ").append(dataSource.poolMaximumIdleConnections);
96-
builder.append("\n poolMaxCheckoutTime ").append(dataSource.poolMaximumCheckoutTime);
97-
builder.append("\n poolTimeToWait ").append(dataSource.poolTimeToWait);
98-
builder.append("\n poolPingEnabled ").append(dataSource.poolPingEnabled);
99-
builder.append("\n poolPingQuery ").append(dataSource.poolPingQuery);
100-
builder.append("\n poolPingConnectionsNotUsedFor ").append(dataSource.poolPingConnectionsNotUsedFor);
101-
builder.append("\n ---STATUS-----------------------------------------------------");
102-
builder.append("\n activeConnections ").append(getActiveConnectionCount());
103-
builder.append("\n idleConnections ").append(getIdleConnectionCount());
104-
builder.append("\n requestCount ").append(getRequestCount());
105-
builder.append("\n averageRequestTime ").append(getAverageRequestTime());
106-
builder.append("\n averageCheckoutTime ").append(getAverageCheckoutTime());
107-
builder.append("\n claimedOverdue ").append(getClaimedOverdueConnectionCount());
108-
builder.append("\n averageOverdueCheckoutTime ").append(getAverageOverdueCheckoutTime());
109-
builder.append("\n hadToWait ").append(getHadToWaitCount());
110-
builder.append("\n averageWaitTime ").append(getAverageWaitTime());
111-
builder.append("\n badConnectionCount ").append(getBadConnectionCount());
112-
builder.append("\n===============================================================");
113-
return builder.toString();
140+
public String toString() {
141+
reentrantLock.lock();
142+
try {
143+
StringBuilder builder = new StringBuilder();
144+
builder.append("\n===CONFIGURATION==============================================");
145+
builder.append("\n jdbcDriver ").append(dataSource.getDriver());
146+
builder.append("\n jdbcUrl ").append(dataSource.getUrl());
147+
builder.append("\n jdbcUsername ").append(dataSource.getUsername());
148+
builder.append("\n jdbcPassword ")
149+
.append(dataSource.getPassword() == null ? "NULL" : "************");
150+
builder.append("\n poolMaxActiveConnections ").append(dataSource.poolMaximumActiveConnections);
151+
builder.append("\n poolMaxIdleConnections ").append(dataSource.poolMaximumIdleConnections);
152+
builder.append("\n poolMaxCheckoutTime ").append(dataSource.poolMaximumCheckoutTime);
153+
builder.append("\n poolTimeToWait ").append(dataSource.poolTimeToWait);
154+
builder.append("\n poolPingEnabled ").append(dataSource.poolPingEnabled);
155+
builder.append("\n poolPingQuery ").append(dataSource.poolPingQuery);
156+
builder.append("\n poolPingConnectionsNotUsedFor ").append(dataSource.poolPingConnectionsNotUsedFor);
157+
builder.append("\n ---STATUS-----------------------------------------------------");
158+
builder.append("\n activeConnections ").append(getActiveConnectionCount());
159+
builder.append("\n idleConnections ").append(getIdleConnectionCount());
160+
builder.append("\n requestCount ").append(getRequestCount());
161+
builder.append("\n averageRequestTime ").append(getAverageRequestTime());
162+
builder.append("\n averageCheckoutTime ").append(getAverageCheckoutTime());
163+
builder.append("\n claimedOverdue ").append(getClaimedOverdueConnectionCount());
164+
builder.append("\n averageOverdueCheckoutTime ").append(getAverageOverdueCheckoutTime());
165+
builder.append("\n hadToWait ").append(getHadToWaitCount());
166+
builder.append("\n averageWaitTime ").append(getAverageWaitTime());
167+
builder.append("\n badConnectionCount ").append(getBadConnectionCount());
168+
builder.append("\n===============================================================");
169+
return builder.toString();
170+
} finally {
171+
reentrantLock.unlock();
172+
}
114173
}
115174

116175
}

0 commit comments

Comments
 (0)