如果我有这样的应用程序:
Class Application {
List state1 = new ArrayList();
Map state2 = new HashMap();
}
我在其他线程中运行RPC服务,该线程用于报告Application的状态(例如:state1中有多少项,其中包含state2键)。 最好的方法是什么?我正在寻找避免在访问state1和state2字段时使用同步的方法(这可能会降低应用程序的性能)。
答案 0 :(得分:1)
同步成本有两个方面。
synchronized
本身的开销;以及
在该区块内执行的操作的费用。
举个例子:
public synchronized int[] getState() {
return new int[] { state1.size(), state2.size() };
}
this
用于锁定。在这种情况下的操作非常便宜(即获得size()
或Colleciton
的{{1}}。因此,担心的唯一开销是Map
本身的成本。
在现代JVM中,成本如此之低,甚至在最极端的情况下都不值得担心。 “最极端”是指这样的呼叫数量非常大或者所需的延迟非常低(亚微秒)。
所以只需使用synchronized
即可。它更具可读性和性能根本不是你想要的问题,除非有更多的东西。