package com.serliunx.statemanagement.manager; import java.util.Arrays; import java.util.List; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 状态管理器的抽象实现 *
* 提供了最基本功能的实现以及部分供子类使用的参数,如:锁、当前状态的序号等.
*
* @author SerLiunx
* @version 1.0.0
* @since 2024/12/28
*/
public abstract class AbstractStateManager implements StateManager {
/**
* 状态列表
*/
private final List stateList;
/**
* 当前状态的序号
*
请保证仅在有写锁的情况下去修改
*/
private volatile int index;
/**
* 默认状态序号
*/
private int defaultIndex = 0;
/**
* 锁
*/
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
/**
* 读锁
*/
protected final ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
/**
* 写锁
*/
protected final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
/**
* @param stateList 状态列表
*/
public AbstractStateManager(List
* 类及子类访问当前状态时不允许使用{@link #current()},因为会造成死锁
*
* stateList) {
this.stateList = stateList;
index = 0;
}
/**
* @param states 状态数组
*/
public AbstractStateManager(S[] states) {
this(Arrays.asList(states));
}
/**
* 保留空构造器
*/
public AbstractStateManager() {
this((List) null);
}
@Override
public S current() {
try {
readLock.lock();
return get();
} finally {
readLock.unlock();
}
}
@Override
public boolean switchTo(S state) {
int i = indexOf(state);
if (i == -1 || i == index) {
return false;
}
try {
writeLock.lock();
// 重新检查
if (i == index) {
return false;
}
index = i;
} finally {
writeLock.unlock();
}
return true;
}
@Override
public void reset() {
try {
writeLock.lock();
index = getDefault();
} finally {
writeLock.unlock();
}
}
@Override
public int size() {
return stateList.size();
}
/**
* 将序号移动至下一个
*