两个线程可以同时访问同步方法吗?
这取决于两个线程试图锁定的对象实例。两个线程不能
synchronized在同一对象实例上访问相同的方法。一个将获得锁,另一个将阻塞,直到第一个线程离开该方法。
在您的示例中,实例方法在包含它们的对象上同步。在这种情况下,调用
alphonse.bow(...)时将锁定该
alphonse对象。
gaston.bow(...)锁
gaston。
您可以通过两种方法来获取一个对象的多个实例以锁定同一对象。
您可以将方法设为
static
,synchronized
在这种情况下,它们将锁定类对象本身。每个类加载器仅这些对象之一。public static synchronized void bow(Friend bower) {它们都可以锁定已定义的静态对象。就像是:
private static final Object lockObject = new Object(); ... public void bow(Friend bower) { synchronized (lockObject) { .... } }- 或者,如果您不想将其设为静态,则可以传入该对象以进行锁定。
您的输出可能类似于以下内容:
- 该
gaston
线程(可能)开始第一和电话bow(alphonse)
- 这将锁定
gaston
对象并输出:Gaston: Alphonse has bowed to me!
- 它呼吁
alphonse.bowBack(this)
。 - 该调用将锁定
alphonse
对象并输出:Alphonse: Gaston has bowed back to me!
alphonse.bowBack(this)
退出,解锁alphonse
对象。gaston.bow(alphonse)
退出,解锁gaston
对象。- 然后
gaston
线程退出。 - 该
alphonse
线程(可能)明年开始,并呼吁bow(gaston)
- 这将锁定
alphonse
对象并输出:Alphonse: Gaston has bowed to me!
- 它呼吁
gaston.bowBack(this)
。 - 该调用将锁定
gaston
对象并输出:Gaston: Alphonse has bowed back to me!
gaston.bowBack(this)
退出,解锁gaston
对象。alphonse.bow(gaston)
退出,解锁alphonse
对象。
这可能以许多不同的顺序发生。
alphonse即使
start()稍后会调用该方法,该线程也可以首先运行。锁唯一使您无法
alphonse.bow(...)使用的
alphonse.bowBack(...)是当前正在运行的if
的调用。正如@ user988052指出的那样,由于每个线程都锁定自己的对象,然后尝试锁定另一个对象,因此很容易会出现死锁。



