java中的同步對象,實際上是對于reference所指的“對象地址”進行同步。 需要注重的問題是,千萬不要對同步對象重新賦值。舉個例子。 class A implements Runnable{ Object lock = new Object();
void run(){ for(...){ synchronized(lock){ // do something ... lock = new Object(); } } }
run函數里面的這段同步代碼實際上是毫無意義的。因為每一次lock都給重新分配了新的對象的reference,每個線程都在新的reference同步。 大家可能覺得希奇,怎么會舉這么一個例子。因為我見過這樣的代碼,同步對象在其它的函數里被重新賦了新值。 這種問題很難查出來。 所以,一般應該把同步對象聲明為final. final Object lock = new Object();