synchronized () 括号中应该传什么对象?

我看jdk源码的时候发现了这样的代码
synchronized () 括号中应该传什么对象?
同步锁中传入了静态的自定义的类“Lock”
1、这种写法和直接传this有什么区别?
2、类“Lock”定义成静态和不定义成静态有什么区别?

对于代码块同步,也就是synchronized(lock){} 这样的写法,lock这个对象就是 “锁”,当两个并行的线程a,b,当a先进入同步块,即a先拿到lock对象,这时候a就相当于用一把锁把synchronized里面的代码锁住了,现在只有a才能执行这块代码,而b就只能等待a用完了lock对象锁之后才能进入同步块。
那么,就有个问题,要达到这个目的,至少对于a,b两个线程来说,锁必须是唯一的,原因很显然,如果有两把锁,那么a,b大可以各持一把锁,同时进入同步块,这显然是不对的。


先回答第二个:2、类“Lock”定义成静态和不定义成静态有什么区别?
建议使用静态,就如上面说的,锁必须是唯一的,而静态变量,尤其是像上那样定义同时实例化的变量能百分百保证锁是唯一的,而如果变量不是static的,那么你必须自己在代码里面控制,保证至少对于要同步的各个线程来说是唯一的。然后,对于你上面贴出来的代码,lock也必须是static的,因为setRunFinalizerOnExit方法是static的
然后,第一个问题:
1、这种写法和直接传this有什么区别?
本质上没有区别,对于同步线程来说都只是一个锁而已,那么,还是那个问题,必须保证锁是唯一的,this指的是当前类的当前实例,用this作为锁,就必须保证各个线程所持有的ShutDown类的实例对象是同一个。