From 52946be558e5cd6f41ce334387f9dd488995764a Mon Sep 17 00:00:00 2001
From: SerLiunx-ctrl <17689543@qq.com>
Date: Thu, 6 Feb 2025 11:11:25 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=B9=B6=E5=8F=91?=
=?UTF-8?q?=E5=9E=8B=E7=8A=B6=E6=80=81=E6=9C=BA(=E5=9F=BA=E4=BA=8ECAS?=
=?UTF-8?q?=E5=AE=9E=E7=8E=B0,=20=E6=9C=AA=E5=AE=8C=E6=88=90).?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../machine/ConcurrentStateMachine.java | 11 ++
.../DefaultConcurrentStateMachine.java | 132 ++++++++++++++++++
.../statemanagement/machine/StateMachine.java | 3 +
.../machine/StateMachineBuilder.java | 3 +
.../manager/AbstractStateManager.java | 15 ++
.../statemanagement/manager/StateManager.java | 6 +
.../serliunx/statemanagement/MachineTest.java | 1 +
7 files changed, 171 insertions(+)
create mode 100644 src/main/java/com/serliunx/statemanagement/machine/ConcurrentStateMachine.java
create mode 100644 src/main/java/com/serliunx/statemanagement/machine/DefaultConcurrentStateMachine.java
diff --git a/src/main/java/com/serliunx/statemanagement/machine/ConcurrentStateMachine.java b/src/main/java/com/serliunx/statemanagement/machine/ConcurrentStateMachine.java
new file mode 100644
index 0000000..2c40e51
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/machine/ConcurrentStateMachine.java
@@ -0,0 +1,11 @@
+package com.serliunx.statemanagement.machine;
+
+/**
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2025/2/6
+ */
+public interface ConcurrentStateMachine extends StateMachine {
+
+ boolean compareAndSet(S expectedValue, S newValue);
+}
diff --git a/src/main/java/com/serliunx/statemanagement/machine/DefaultConcurrentStateMachine.java b/src/main/java/com/serliunx/statemanagement/machine/DefaultConcurrentStateMachine.java
new file mode 100644
index 0000000..8e5bbcd
--- /dev/null
+++ b/src/main/java/com/serliunx/statemanagement/machine/DefaultConcurrentStateMachine.java
@@ -0,0 +1,132 @@
+package com.serliunx.statemanagement.machine;
+
+import com.serliunx.statemanagement.machine.handler.StateHandlerWrapper;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
+
+/**
+ * @author SerLiunx
+ * @version 1.0.0
+ * @since 2025/2/6
+ */
+public class DefaultConcurrentStateMachine extends AbstractStateMachine implements ConcurrentStateMachine {
+
+ /**
+ * 当前状态
+ */
+ private final AtomicInteger index = new AtomicInteger(0);
+
+ DefaultConcurrentStateMachine(List stateList,
+ Map>> entryHandlers,
+ Map>> leaveHandlers,
+ Map>> exchangeHandlers,
+ Map