Java中的同步方法和同步块有什么区别?
我一直在网上搜索答案,人们似乎对此不太确定:-(
我的看法是,两者之间没有区别,只是synch块的作用域可能更多,因此锁定的时间更少了?
如果在静态方法上使用Lock,则采用什么Lock?班级锁是什么意思?
同步方法将方法接收器用作锁(即,this用于非静态方法,而用于静态方法的封闭类)。 Synchronizedblocks将表达式用作锁。
this
Synchronized
因此,以下两种方法等效于锁定预期对象:
synchronized void mymethod() { ... } void mymethod() { synchronized (this) { ... } }
对于静态方法,该类将被锁定:
class MyClass { synchronized static mystatic() { ... } static mystaticeq() { syncrhonized (MyClass.class) { ... } } }
对于同步块,可以将任何非null对象用作锁:
null
synchronized (mymap) { mymap.put(..., ...); }
锁定范围
对于同步方法,该锁将在整个方法范围内保持,而在synchronized块中,该锁仅在该块范围内保持(否则称为关键节)。实际上,如果JVMsynchronized可以证明可以安全完成,则可以通过从块执行中删除一些操作来进行优化。
synchronized