1818 */
1919package org .neo4j .driver .internal ;
2020
21- import java .util .concurrent .locks . ReentrantReadWriteLock ;
21+ import java .util .concurrent .atomic . AtomicBoolean ;
2222
2323import org .neo4j .driver .internal .security .SecurityPlan ;
2424import org .neo4j .driver .v1 .AccessMode ;
@@ -34,8 +34,7 @@ abstract class BaseDriver implements Driver
3434 private final SecurityPlan securityPlan ;
3535 protected final Logger log ;
3636
37- private final ReentrantReadWriteLock closedLock = new ReentrantReadWriteLock ();
38- private boolean closed ;
37+ private AtomicBoolean closed = new AtomicBoolean ( false );
3938
4039 BaseDriver ( SecurityPlan securityPlan , Logging logging )
4140 {
@@ -46,16 +45,8 @@ abstract class BaseDriver implements Driver
4645 @ Override
4746 public final boolean isEncrypted ()
4847 {
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 ();
5950 }
6051
6152 @ Override
@@ -67,33 +58,26 @@ public final Session session()
6758 @ Override
6859 public final Session session ( AccessMode mode )
6960 {
70- closedLock .readLock ().lock ();
71- try
72- {
73- assertOpen ();
74- return newSessionWithMode ( mode );
75- }
76- finally
61+ assertOpen ();
62+ Session session = newSessionWithMode ( mode );
63+ if ( closed .get () )
7764 {
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 driverCloseException ();
7971 }
72+ return session ;
8073 }
8174
8275 @ Override
8376 public final void close ()
8477 {
85- closedLock .writeLock ().lock ();
86- try
78+ if ( closed .compareAndSet (false , true ) )
8779 {
88- if ( !closed )
89- {
90- closeResources ();
91- }
92- }
93- finally
94- {
95- closed = true ;
96- closedLock .writeLock ().unlock ();
80+ closeResources ();
9781 }
9882 }
9983
@@ -103,9 +87,14 @@ public final void close()
10387
10488 private void assertOpen ()
10589 {
106- if ( closed )
90+ if ( closed . get () )
10791 {
108- throw new IllegalStateException ( "This driver instance has already been closed" );
92+ throw driverCloseException ( );
10993 }
11094 }
95+
96+ private IllegalStateException driverCloseException ()
97+ {
98+ return new IllegalStateException ( "This driver instance has already been closed" );
99+ }
111100}
0 commit comments