diff --git a/src/main/java/com/serliunx/statemanagement/machine/ConcurrentStateMachine.java b/src/main/java/com/serliunx/statemanagement/machine/ConcurrentStateMachine.java index cc3cfa8..02fa16b 100644 --- a/src/main/java/com/serliunx/statemanagement/machine/ConcurrentStateMachine.java +++ b/src/main/java/com/serliunx/statemanagement/machine/ConcurrentStateMachine.java @@ -13,7 +13,7 @@ public interface ConcurrentStateMachine extends StateMachine { /** * 尝试使用CAS更新状态 - *
  • 无论是否成功更新都不触发状态处理器 + *
  • 成功更新时触发状态处理器 * * @param expectedValue 前置状态 * @param newValue 更新的状态值 diff --git a/src/main/java/com/serliunx/statemanagement/machine/DefaultConcurrentStateMachine.java b/src/main/java/com/serliunx/statemanagement/machine/DefaultConcurrentStateMachine.java index 66bdc8f..ae7d505 100644 --- a/src/main/java/com/serliunx/statemanagement/machine/DefaultConcurrentStateMachine.java +++ b/src/main/java/com/serliunx/statemanagement/machine/DefaultConcurrentStateMachine.java @@ -41,7 +41,7 @@ public class DefaultConcurrentStateMachine extends AbstractStateMachine im @Override public boolean compareAndSet(S expectedValue, S newValue) { - return compareAndSet(expectedValue, newValue, false); + return compareAndSet(expectedValue, newValue, true); } @Override diff --git a/src/test/java/com/serliunx/statemanagement/MachineTest.java b/src/test/java/com/serliunx/statemanagement/MachineTest.java index 7256e7c..10c801a 100644 --- a/src/test/java/com/serliunx/statemanagement/MachineTest.java +++ b/src/test/java/com/serliunx/statemanagement/MachineTest.java @@ -7,6 +7,9 @@ import com.serliunx.statemanagement.support.PrinterEvent; import com.serliunx.statemanagement.support.PrinterState; import org.junit.Test; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + /** * 状态机测试 * @@ -16,6 +19,8 @@ import org.junit.Test; */ public class MachineTest { + private final ExecutorService executor = Executors.newFixedThreadPool(5); + @Test public void testStandardStateMachine() throws Exception { StateMachine stateMachine = StateMachineBuilder.from(PrinterState.values()) @@ -46,4 +51,22 @@ public class MachineTest { System.out.println(stateMachine.current()); stateMachine.close(); } + + @Test + public void testConcurrentStateMachine2() throws Exception { + ConcurrentStateMachine stateMachine = StateMachineBuilder.from(PrinterState.values()) + .async(false) + .concurrent() + .whenEntry(PrinterState.STOPPING, h -> { + System.out.println("entering stopping..."); + }) + .build(); + + for (int i = 0; i < 5; i++) { + executor.execute(() -> { + System.out.println(stateMachine.compareAndSet(PrinterState.IDLE, PrinterState.STOPPING, true)); + }); + } + + } }