Possible race condition in set and get

Possible race condition in set and get for
TransactionSynchronizationRegistry


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/879e03ab
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/879e03ab
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/879e03ab

Branch: refs/heads/tomee-1.7.3-prepare
Commit: 879e03ab40f4aa483e650641cba6f446dec0368b
Parents: 6140f87
Author: AndyGee <andy...@gmx.de>
Authored: Fri Nov 20 11:59:53 2015 +0100
Committer: AndyGee <andy...@gmx.de>
Committed: Fri Nov 20 11:59:53 2015 +0100

----------------------------------------------------------------------
 .../core/transaction/JtaTransactionPolicy.java  | 33 +++++++++++++++-----
 1 file changed, 26 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/879e03ab/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java
index 4755037..b51e79c 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java
@@ -48,7 +48,7 @@ public abstract class JtaTransactionPolicy implements 
TransactionPolicy {
     protected final TransactionType transactionType;
 
     protected final TransactionManager transactionManager;
-    private final TransactionSynchronizationRegistry synchronizationRegistry;
+    private TransactionSynchronizationRegistry synchronizationRegistry;
     private Map<Object, Object> resources;
     private final List<TransactionSynchronization> synchronizations = new 
LinkedList<TransactionSynchronization>();
     private boolean rollbackOnly;
@@ -56,15 +56,24 @@ public abstract class JtaTransactionPolicy implements 
TransactionPolicy {
     public JtaTransactionPolicy(final TransactionType transactionType, final 
TransactionManager transactionManager) {
         this.transactionType = transactionType;
         this.transactionManager = transactionManager;
-        synchronizationRegistry = 
SystemInstance.get().getComponent(TransactionSynchronizationRegistry.class);
     }
 
+    private TransactionSynchronizationRegistry getSynchronizationRegistry() {
+        if (null == this.synchronizationRegistry) {
+            this.synchronizationRegistry = 
SystemInstance.get().getComponent(TransactionSynchronizationRegistry.class);
+        }
+
+        return this.synchronizationRegistry;
+    }
+
+    @Override
     public TransactionType getTransactionType() {
         return transactionType;
     }
 
     public abstract Transaction getCurrentTransaction();
 
+    @Override
     public boolean isTransactionActive() {
         final Transaction trasaction = getCurrentTransaction();
         if (trasaction == null) {
@@ -79,6 +88,7 @@ public abstract class JtaTransactionPolicy implements 
TransactionPolicy {
         }
     }
 
+    @Override
     public boolean isRollbackOnly() {
         final Transaction trasaction = getCurrentTransaction();
         if (trasaction != null) {
@@ -93,6 +103,7 @@ public abstract class JtaTransactionPolicy implements 
TransactionPolicy {
         }
     }
 
+    @Override
     public void setRollbackOnly() {
         setRollbackOnly(null);
     }
@@ -107,9 +118,10 @@ public abstract class JtaTransactionPolicy implements 
TransactionPolicy {
         }
     }
 
+    @Override
     public Object getResource(final Object key) {
         if (isTransactionActive()) {
-            return synchronizationRegistry.getResource(key);
+            return this.getSynchronizationRegistry().getResource(key);
         }
 
         if (resources == null) {
@@ -118,9 +130,10 @@ public abstract class JtaTransactionPolicy implements 
TransactionPolicy {
         return resources.get(key);
     }
 
+    @Override
     public void putResource(final Object key, final Object value) {
         if (isTransactionActive()) {
-            synchronizationRegistry.putResource(key, value);
+            this.getSynchronizationRegistry().putResource(key, value);
         }
 
         if (resources == null) {
@@ -129,10 +142,12 @@ public abstract class JtaTransactionPolicy implements 
TransactionPolicy {
         resources.put(key, value);
     }
 
+    @Override
     public Object removeResource(final Object key) {
         if (isTransactionActive()) {
-            final Object value = synchronizationRegistry.getResource(key);
-            synchronizationRegistry.putResource(key, null);
+            final TransactionSynchronizationRegistry sr = 
this.getSynchronizationRegistry();
+            final Object value = sr.getResource(key);
+            sr.putResource(key, null);
             return value;
         }
 
@@ -142,13 +157,16 @@ public abstract class JtaTransactionPolicy implements 
TransactionPolicy {
         return resources.remove(key);
     }
 
+    @Override
     public void registerSynchronization(final TransactionSynchronization 
synchronization) {
         if (isTransactionActive()) {
-            synchronizationRegistry.registerInterposedSynchronization(new 
Synchronization() {
+            
this.getSynchronizationRegistry().registerInterposedSynchronization(new 
Synchronization() {
+                @Override
                 public void beforeCompletion() {
                     synchronization.beforeCompletion();
                 }
 
+                @Override
                 public void afterCompletion(final int s) {
                     final TransactionSynchronization.Status status;
                     if (s == Status.STATUS_COMMITTED) {
@@ -185,6 +203,7 @@ public abstract class JtaTransactionPolicy implements 
TransactionPolicy {
         }
     }
 
+    @Override
     public void enlistResource(final XAResource xaResource) throws 
SystemException {
         final Transaction transaction = getCurrentTransaction();
         if (transaction != null) {

Reply via email to