您似乎在混合事物。
首先
public synchronized void method() {}从同步角度看,它等效于:
public void method() { synchronized (this) { }}优点/缺点已被提及,各种重复项提供了更多信息。
其次,
synchronized(someObject) { //some instructions}意味着同步块中的指令不能由2个线程同时执行,因为它们需要先获取监视器
someObject。(假设someObject是不变的最终引用)。
就您而言,
someObject恰好是
this。
对象中任何未同步的代码仍可以并发执行,即使监视器处于
this运行状态,因为该线程正在运行同步块,即使该监视器处于打开状态。换句话说,
synchronized(this)不“锁定整个对象”。它仅防止2个线程同时执行同步块。
最后,如果您有两个
synchronized方法(都
this用作锁),如果一个线程(T1)获得
this执行这两个方法之一的锁,则不允许其他线程执行这两个方法中的
任何 一个,因为它们需要获取
thisT1已经持有的锁。
这种情况可能会在关键部分中引起争用,在这种情况下,必须使用更细粒度的锁定策略(例如,使用多个锁定)。



