gpt4 book ai didi

java - 如何在 Java 单例中维护可变状态

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:15 26 4
gpt4 key购买 nike

我有一个用 Java 编写的 Singelton(在一个 OSGi 服务中),我想在其中维护一些状态(一个计数器)。

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

或者我应该将 Action 包装在同步方法中吗? (这与仅仅使 var 同步有什么不同吗?)

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

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

public String helloWorld() { count++; return "Hello World"; }
public int getHelloCount() { return count; }
}

更新:我怎么会像 map 或列表这样的东西?是否也更喜欢使用这些的原子版本?还是同步更好?

最佳答案

单例的问题在于它们需要一个作用域。如果您在 OSGi 中注册服务,那么这就是框架中的单例。然而,由于 OSGi 避免了像瘟疫这样的静态,人们可以在同一个 VM 中启动多个框架(嵌套或作为兄弟),这可能意味着您的服务在不同的框架中注册了多次。通常,这正是您想要的。如果这还不够单例,那么范围应该是什么?虚拟机、进程、机器、网络、世界?人们为您提供的用于创建单例的所有技巧都忘记告诉您它们的作用域仅适用于您碰巧所在的类加载器。

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

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

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

关于java - 如何在 Java 单例中维护可变状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16071209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com