同步方法名 vs 同步(对象)
这是正确的,也是一种选择。我认为只同步对该对象的访问而不是同步它的所有方法会更有效。
虽然差异可能很细微,但如果您在单个线程中使用相同的对象会很有用
ie(在方法上使用同步关键字)
class SomeClass {
private int clickCount = 0;
public synchronized void click(){
clickCount++;
}
}
当这样定义一个类时,一次只有一个线程可以调用click 方法。
如果在单线程应用程序中过于频繁地调用此方法会怎样?您将花费一些额外的时间检查该线程是否可以在不需要时获得对象锁。
class Main {
public static void main( String [] args ) {
SomeClass someObject = new SomeClass();
for( int i = 0 ; i < Integer.MAX_VALUE ; i++ ) {
someObject.click();
}
}
}
在这种情况下,检查线程是否可以锁定对象将被不必要地调用Integer.MAX_VALUE (2 147 483 647) 次。
因此在这种情况下删除同步关键字会运行得更快。
那么,您将如何在多线程应用程序中做到这一点?
你只是同步对象:
synchronized ( someObject ) {
someObject.click();
}
向量与数组列表
作为附加说明,这种用法(syncrhonized methodName vs.syncrhonized(object))顺便说一句,是java.util.Vector 现在被java.util.ArrayList 取代的原因之一。许多Vector 方法是同步的。
大多数情况下,列表用于单线程应用程序或一段代码(即 jsp/servlets 中的代码在单线程中执行),而 Vector 的额外同步对性能没有帮助。
Hashtable 被替换为 HashMap 也是如此