如何在Java Singleton中维护可变状态

emp*_*e29 3 java singleton synchronization osgi

我在Java中有一个Singelton(在OSGi服务中)并希望在其中维护一些状态(计数器).

这个变量应该是静态的吗?还是同步?或两者?

或者我应该以同步方式包装动作?(这会使var同步吗?)

我希望服务操作的消费者增加此计数器.

public MyServiceImpl implements MyService {
    private int count = 0; // static? syncronized?

    public String helloWorld() { count++; return "Hello World"; }
    public int getHelloCount() { return count; }
}
Run Code Online (Sandbox Code Playgroud)

更新:我怎么会像地图或列表那样?是否也喜欢使用这些的原子版本?或者同步更好吗?

Pet*_*ens 7

单身人士的问题是他们需要一个范围.如果您在OSGi中注册服务,那么这是框架中的单例.但是,由于OSGi避免像瘟疫一样的静态,人们可以在同一个VM中启动多个框架(嵌套或兄弟),这可能意味着您的服务在不同的框架中多次注册.一般来说,这正是你想要的.如果这不够单身,那么范围应该是什么?VM,流程,机器,网络,世界?人们为你创建单身人士所提供的所有技巧都忘了告诉你他们的范围只适用于你碰巧遇到的类加载器.

在OSGi中,假设您的范围是框架.因此,只需注册一个服务并使用实例变量.由于OSGi在并发环境中运行,因此您必须像所有其他帖子所指示的那样使用同步方法或更好的AtomicLong/AtomicInteger.

如果您有多个需要共享单例的服务,只需创建一个额外的服务来表示单例.

永远不要使用静态,因为它们会显着降低代码的可重用性,它们具有全局变量的所有弊端.纯OSGi的优点之一是它允许您几乎完全使用实例编程,而不必使用静态和类名(遭受相同的全局变量问题).