多線程需要一定的“計算機”式的思維!
synchronized method 情況下,當有任何線程調用這個 method 時,其他線程都無法訪問這個實例(instance)中所有聲明爲 synchronized 的 method。
而 synchronized object 就靈活很多,因爲它只限制了 synchronized(object){ ... } 中的這部分代碼只能由一個線程訪問。也就是說盡管有兩個線程訪問同一個實例 (instance),下面的代碼依然可以保證正常工作:
public class ThreadSafe{
public void method1(){
synchorinzed(object1){
.....
}
}
public void method2(){
synchronized(object2){
.....
}
}
}
當有兩個線程同時分別訪問 method1 和 method2,兩個線程都不會被阻塞,效率就比使用 synchronized method 高多了。
但如果有兩個線程想同時訪問 method2,則同一時間只能有一個線程使用 synchronized(object2){ ... } 裏的代碼。
有一點千萬要記住,synchronized object 與 synchronized method 這兩種方法是針對同一個實例(instance),而不是類!!這點一定要搞清楚!