You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中synchronized(this)与字段锁的差异:能否同时执行?

Java同步锁互斥问题解析

示例代码

class BankAccount {
  private int balance = 0;

  int getBalance() {
    synchronized(this) {
      return balance;
    }
  }

  void setBalance(int x) {
    synchronized(this) {
      balance = x;
    }
  }

  void withdraw(int amount) {
    synchronized(this) {
      int b = getBalance();
      if (amount > b)
        throw new IllegalArgumentException("余额不足");
      setBalance(b - amount);
    }
  }
}

问题

上述代码的withdraw方法使用了synchronized(this)加锁。若存在另一个使用synchronized(balance)(对balance字段加锁而非this)的方法,该方法能否与withdraw方法同时执行?

回答

能同时执行。

Java的synchronized锁是基于对象生效的:只有当两个方法锁定的是同一个对象时,才会产生互斥关系,同一时间只能有一个线程执行其中一个方法。

而这里withdraw锁定的是当前BankAccount类的实例对象(this),另一个方法锁定的是balance对应的对象——哪怕balance是该类的成员字段,它和this本身也是完全不同的两个对象。因此两个线程可以分别持有这两个不同的锁,同时执行各自的方法,互相不会被阻塞。

内容的提问来源于stack exchange,提问作者Ronald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:04:59