You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cs...@apache.org on 2019/09/06 15:57:05 UTC

[activemq] branch master updated: AMQ-7300 - Improve performance of LongSequenceGenerator

This is an automated email from the ASF dual-hosted git repository.

cshannon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq.git


The following commit(s) were added to refs/heads/master by this push:
     new 4db2656  AMQ-7300 - Improve performance of LongSequenceGenerator
4db2656 is described below

commit 4db26560660783c5a7b15af7ca9ba27c9f4d04bc
Author: Christopher L. Shannon (cshannon) <ch...@gmail.com>
AuthorDate: Fri Sep 6 11:55:02 2019 -0400

    AMQ-7300 - Improve performance of LongSequenceGenerator
    
    LongSequenceGenerator now uses an AtomicLongFieldUpdater instead of
    synchronized
---
 .../activemq/util/LongSequenceGenerator.java       | 25 +++++++++++++++-------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/activemq-client/src/main/java/org/apache/activemq/util/LongSequenceGenerator.java b/activemq-client/src/main/java/org/apache/activemq/util/LongSequenceGenerator.java
index 53ae7f1..f3590a9 100644
--- a/activemq-client/src/main/java/org/apache/activemq/util/LongSequenceGenerator.java
+++ b/activemq-client/src/main/java/org/apache/activemq/util/LongSequenceGenerator.java
@@ -16,20 +16,29 @@
  */
 package org.apache.activemq.util;
 
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+
+/**
+ * Updated LongSequenceGenerator that uses an AtomicLongFieldUpdater for performance instead of
+ * synchronized methods
+ */
 public class LongSequenceGenerator {
 
-    private long lastSequenceId;
+    private static final AtomicLongFieldUpdater<LongSequenceGenerator> SEQUENCE_UPDATER =
+            AtomicLongFieldUpdater.newUpdater(LongSequenceGenerator.class, "lastSequenceId");
 
-    public synchronized long getNextSequenceId() {
-        return ++lastSequenceId;
-    }
+    private volatile long lastSequenceId;
 
-    public synchronized long getLastSequenceId() {
-        return lastSequenceId;
+    public long getNextSequenceId() {
+        return SEQUENCE_UPDATER.incrementAndGet(this);
     }
 
-    public synchronized void setLastSequenceId(long l) {
-        lastSequenceId = l;
+    public long getLastSequenceId() {
+        return SEQUENCE_UPDATER.get(this);
     }
 
+    public void setLastSequenceId(long l) {
+        SEQUENCE_UPDATER.set(this, l);
+    }
 }