捕获应用程序状态的安全方法?

时间:2010-08-08 09:17:51

标签: java multithreading synchronization

如果我有这样的应用程序:

Class Application {  
    List state1 = new ArrayList();  
    Map state2  = new HashMap();  
}  

我在其他线程中运行RPC服务,该线程用于报告Application的状态(例如:state1中有多少项,其中包含state2键)。 最好的方法是什么?我正在寻找避免在访问state1和state2字段时使用同步的方法(这可能会降低应用程序的性能)。

1 个答案:

答案 0 :(得分:1)

同步成本有两个方面。

  1. synchronized本身的开销;以及

  2. 在该区块内执行的操作的费用。

  3. 举个例子:

    public synchronized int[] getState() {
     return new int[] { state1.size(), state2.size() };
    }
    

    this用于锁定。在这种情况下的操作非常便宜(即获得size()Colleciton的{​​{1}}。因此,担心的唯一开销是Map本身的成本。

    在现代JVM中,成本如此之低,甚至在最极端的情况下都不值得担心。 “最极端”是指这样的呼叫数量非常大或者所需的延迟非常低(亚微秒)。

    所以只需使用synchronized即可。它更具可读性和性能根本不是你想要的问题,除非有更多的东西。