synchronized void foo() 和 void foo() { synchronized(this) { ... } } 是不是等价的?真实构造跨线程竞争场景,用等待时间的真实数字来回答。
上一篇:Fork/Join 真实分给了几个线程:真实验证 4 个工作线程真的都参与了计算
让一个线程先拿到锁忙 500ms,另一个线程用不同的写法去申请同一把锁,看真实要等多久。
SyncMethodVsBlockDemo.java static class Shared { synchronized void methodLock() { // 锁的是 this try { Thread.sleep(300); } catch (InterruptedException ignored) {} } void blockLock() { synchronized (this) { // 显式锁 this,和上面锁的是同一个对象 try { Thread.sleep(300); } catch (InterruptedException ignored) {} } } }
main 线程调用 blockLock() 真实等待了约 808ms(t1 持有同一把锁 500ms)
main 线程调用 methodLock()(synchronized 方法) 真实等待了约 805ms 这证明 synchronized 方法和 synchronized(this) 块真实锁的是同一把对象锁
两个方向的真实等待时间几乎一致(808ms 和 805ms,对应"持锁方 500ms + 自己执行体 300ms"这个预期结构),证明不管申请锁的一方用的是哪种写法,真实排队等待的都是同一把锁——t1 用 synchronized 方法持锁,能真实挡住 synchronized(this) 块想进来的线程;反过来也成立。如果两者锁的是不同对象,这两次调用应该几乎立即返回(各自的锁都没人占用),不会真实等待 800ms。
每一行都是真实运行这段代码,用 Thread.holdsLock() 检查得到的结果。