同步方法名 VS同步的(对象)
这是正确的,并且是一个备选。我认为只有同步所有方法才能更有效地同步对该对象的访问。
虽然差可以是微妙的,如果使用了在单一线程相同的对象
即(使用方法synchronized关键字)
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();
}
矢量VS的ArrayList
作为附加的注释,这种用法(syncrhonized方法名与synchonized(object))顺便说一下,java.util.Vector
现在被java.util.ArrayList
取代的原因之一。许多Vector
方法是同步的。
大多数情况下,单个线程应用程序或代码片段中使用的列表(即jsp/servlets中的代码是在单个线程中执行的),而Vector的额外同步对性能没有帮助。
也是一样Hashtable
通过HashMap
你能提供一个使用wait()和notify()以及synchronized语句的例子吗? – 2010-05-03 18:55:08