- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个用 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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!