同步方法名 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