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
相关产品推荐
相关产品推荐

