18
18
*/
19
19
package org .neo4j .driver .internal ;
20
20
21
- import java .util .concurrent .locks . ReentrantReadWriteLock ;
21
+ import java .util .concurrent .atomic . AtomicBoolean ;
22
22
23
23
import org .neo4j .driver .internal .security .SecurityPlan ;
24
24
import org .neo4j .driver .v1 .AccessMode ;
@@ -34,8 +34,7 @@ abstract class BaseDriver implements Driver
34
34
private final SecurityPlan securityPlan ;
35
35
protected final Logger log ;
36
36
37
- private final ReentrantReadWriteLock closedLock = new ReentrantReadWriteLock ();
38
- private boolean closed ;
37
+ private AtomicBoolean closed = new AtomicBoolean ( false );
39
38
40
39
BaseDriver ( SecurityPlan securityPlan , Logging logging )
41
40
{
@@ -46,16 +45,8 @@ abstract class BaseDriver implements Driver
46
45
@ Override
47
46
public final boolean isEncrypted ()
48
47
{
49
- closedLock .readLock ().lock ();
50
- try
51
- {
52
- assertOpen ();
53
- return securityPlan .requiresEncryption ();
54
- }
55
- finally
56
- {
57
- closedLock .readLock ().unlock ();
58
- }
48
+ assertOpen ();
49
+ return securityPlan .requiresEncryption ();
59
50
}
60
51
61
52
@ Override
@@ -67,33 +58,26 @@ public final Session session()
67
58
@ Override
68
59
public final Session session ( AccessMode mode )
69
60
{
70
- closedLock .readLock ().lock ();
71
- try
61
+ assertOpen ();
62
+ Session session = newSessionWithMode ( mode );
63
+ if ( closed .get () )
72
64
{
73
- assertOpen ();
74
- return newSessionWithMode ( mode );
75
- }
76
- finally
77
- {
78
- closedLock . readLock (). unlock ( );
65
+ // the driver is already closed and we either 1. obtain this session from the old session pool
66
+ // or 2. we obtain this session from a new session pool
67
+ // For 1. this closeResources will take no effect as everything is already closed.
68
+ // For 2. this closeResources will close the new connection pool just created to ensure no resource leak.
69
+ closeResources ();
70
+ throw new IllegalStateException ( "This driver instance has already been closed" );
79
71
}
72
+ return session ;
80
73
}
81
74
82
75
@ Override
83
76
public final void close ()
84
77
{
85
- closedLock .writeLock ().lock ();
86
- try
87
- {
88
- if ( !closed )
89
- {
90
- closeResources ();
91
- }
92
- }
93
- finally
78
+ if ( closed .compareAndSet (false , true ) )
94
79
{
95
- closed = true ;
96
- closedLock .writeLock ().unlock ();
80
+ closeResources ();
97
81
}
98
82
}
99
83
@@ -103,7 +87,7 @@ public final void close()
103
87
104
88
private void assertOpen ()
105
89
{
106
- if ( closed )
90
+ if ( closed . get () )
107
91
{
108
92
throw new IllegalStateException ( "This driver instance has already been closed" );
109
93
}
0 commit comments