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();