【发布时间】:2015-01-22 09:50:06
【问题描述】:
给定一个带有静态方法的Factory 类为SomeModel 类创建实例,它将在多线程环境中运行。这个Factory有三个方法:
- 开始
- 停止
- createSomeModel
还有一个state 字段,位于:
- 已关闭
- 开始
- starting_failed
- 开始
- 关闭
- shutting_failed
这是Factory 类的当前设计:
public class Factory {
enum State{
shutted, starting, starting_failed, started, shutting, shutting_failed
}
State state;
public static void start(){
// can only be invoked when state=shutted
}
public static void stop(){
// can only be invoked when state=started
}
public static void restart(){
stop();
start();
}
public static SomeModel create(){
// can only be invoked when state=started
}
}
我的要求是:create方法只能在state==started时调用,start方法只能在state==shutted || state == shutting_failed时调用,stop方法只能在state==started|| state == starting_failed时调用。
我知道这与线程同步问题有关,但我对自己的线程知识没有信心。请帮帮我。
【问题讨论】:
-
使用
synchronized块。 -
你确定
Factory需要有static方法吗?看起来您希望在所有应用程序中都拥有一个Factory实例,并且客户端无需调用start方法。 -
@LuiggiMendoza 是的,你是对的,使用静态方法是不是很糟糕?我应该使用单例模式吗?
-
拥有
static方法还不错,但start并不意味着是static。你可以让你的Factory成为一个枚举,它将是一个单例,它的初始化将是线程安全的。不过,您应该应用一些技术,以便方法的执行是线程安全的。由于您没有提供有关您的方法的具体细节,我们只能声明您应该在验证Factory的状态后使用synchronized块来实现start和stop方法,以及create方法根本不需要任何同步,除非它修改了Factory的状态。 -
您将使用
if来检查状态,如果status仍然是无效状态,则抛出RuntimeException说明Factory尚未初始化.
标签: java multithreading thread-safety