java如何使我的代码线程安全?
给定一个带有静态方法的Factory
类为SomeModel
类创建实例,它将在多线程环境中运行。这个Factory
有三种方法:
- 开始
- 住手
- createSomeModel
和state
字段,位于:
- 关闭
- 开始
- 启动_失败
- 开始
- 关闭
- 你失败了
下面是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
时调用
我知道这与线程同步问题有关,但我对自己的线程知识没有信心。请帮帮我
# 1 楼答案
此方法不会同步create方法,因此这不会成为瓶颈。当你停下来的时候,不要让新的创造物被执行。 双重检查“if state==started”是避免竞争条件所必需的
可能有比使用线程更好的解决方案。睡眠等待所有创建模型完成,但我不知道如何轻松完成
希望这能对你有所帮助
# 2 楼答案
不需要同步。对状态使用volatile或AtomicReference。 我给出了使用volatile的示例。最好与基元类型一起使用,因此必须为不同的状态添加int值。虽然你可以使用枚举的序数,但这样就有点清楚了。否则可以使用原子引用
# 3 楼答案
我建议您根本不要使用静态方法
相反,创建
Factory
类的对象,并让所有方法都是synchronized
希望这有帮助