在一个高度并发的Java程序中,假设我的方法正确编写并正确同步,我想知道如何确定哪个更好:
void synchronized something() {
...
}
或
void something() {
synchronized(this) {
...
}
// here do stuff no requiring synchronization
.
. // do computation 'A'
.
synchronized(this) {
...
}
// here do other stuff no requiring synchronization
.
. // do computation 'B'
.
synchronized(this) {
...
}
}
现在我意识到如果计算'A'和'B'需要花费很多时间,那么第二个版本显然会更好。
然而,我的问题是:你知道第二个版本的效率更高吗?
第二个版本是否总是更快或是否存在多次获取/释放锁定的隐藏成本?
如果我的计算'A'只是一些微不足道的事情,那该怎么办?
s.getString().substring( 0, 2 ).toLowerCase();
答案 0 :(得分:8)
是的,synchronized
需要时间。如果实际计算很简单并且它在一个循环内,那么与实际计算相比,它的成本很多。
请参阅此示例:http://ideone.com/zgpB7
要确定哪一个更适合您的程序,让它执行一些东西并查看哪个时间更快。
答案 1 :(得分:2)
thejh指出重复锁定线程需要一些成本。但是,每当我和人们谈论并行线程时,它总是要确保所有线程在同时运行时快速执行。
保持锁定时间超过要求,可以减慢其他线程的速度。当你做的工作不会干扰他们想做的工作时,他们必须坐等。如果这是毫秒对您来说实际上很重要的情况,您应该使用分析器来查看根据您的情况最有效的方法。多线程优化是存在通常适用的“最佳实践”的情况之一,但是您不会获得适用于所有情况的规则。如果你需要那么多的粒度,你应该测试它并看看。
答案 2 :(得分:1)
“正确写入”和“正确同步”是否意味着多同步情况下代码部分之间没有依赖关系?如果存在依赖关系,则可能是多同步情况可能导致违反不变量。换句话说,你能保证多同步案例的执行不会导致某些对象处于无效状态吗?如果没有,那么单一同步的情况可能会更好。