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

Java 捕获应用程序状态的安全方法?,java,multithreading,synchronization,Java,Multithreading,Synchronization,如果我有这样一个应用程序: Class Application { List state1 = new ArrayList(); Map state2 = new HashMap(); } 我在另一个线程中运行了一个RPC服务,该线程用于报告应用程序的状态(例如:state1中有多少项,其中包含state2键)。 最好的方法是什么?我正在寻找避免在访问state1和state2字段时使用synchronize的方法(这可能会降低应用程序的性能)。同步的成本有两

如果我有这样一个应用程序:

Class Application {  
    List state1 = new ArrayList();  
    Map state2  = new HashMap();  
}  
我在另一个线程中运行了一个RPC服务,该线程用于报告应用程序的状态(例如:state1中有多少项,其中包含state2键)。
最好的方法是什么?我正在寻找避免在访问state1和state2字段时使用synchronize的方法(这可能会降低应用程序的性能)。

同步的成本有两个方面

  • 同步的
    本身的开销;及

  • 在该区块内执行操作的成本

  • 举个例子:

    public synchronized int[] getState() {
     return new int[] { state1.size(), state2.size() };
    }
    
    用于锁。这种情况下的操作非常便宜(即获取
    集合
    映射
    大小()。因此,唯一需要担心的开销是
    同步的
    本身的成本

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


    所以只需使用
    synchronized
    。它的可读性要高得多,性能也不是您想要的问题,除非还有其他问题。

    同步的成本有两个方面

  • 同步的
    本身的开销;及

  • 在该区块内执行操作的成本

  • 举个例子:

    public synchronized int[] getState() {
     return new int[] { state1.size(), state2.size() };
    }
    
    用于锁。这种情况下的操作非常便宜(即获取
    集合
    映射
    大小()。因此,唯一需要担心的开销是
    同步的
    本身的成本

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


    所以只需使用
    synchronized
    。它的可读性要高得多,性能也不是你想要的问题,除非还有其他问题。

    重新格式化的代码;如果不正确,请还原。重新格式化的代码;如果不正确,请还原。但是克莱特斯,如果我需要像这样捕获state2的所有键:public synchronized List getAllKeys(){List val=new ArrayList();val.addAll(state2.keySet());return val;}public synchronized void addItemToState2(Object k,Object v){state2.put(k,v);}addItemToState2每秒调用这么多次,getAllKeys很少被调用,但是我仍然需要一直同步,可以吗?抱歉,我正在这里学习设置邮件格式:(.@secmask我的一般建议是,在出现问题之前不要解决问题。我可以想象你会每秒添加1000个键,甚至不会注意到任何半现代机器上的
    同步开销。但是cletus,如果我需要像这样捕获state2的所有键:public synchronized List getAllKeys(){List val=new ArrayList();val.addAll(state2.keySet());return val;}public synchronized void addItemToState2(Object k,Object v){state2.put(k,v);}addItemToState2每秒调用很多次,getAllKeys很少调用,但我仍然需要一直同步,可以吗?抱歉,我正在这里学习格式化消息:(.@secmask我的一般建议是,在出现问题之前不要解决问题。我可以想象你会每秒添加1000个键,甚至不会注意到任何半现代机器上的
    同步开销。