栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

两个线程可以同时访问同步方法吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

两个线程可以同时访问同步方法吗?

两个线程可以同时访问同步方法吗?

这取决于两个线程试图锁定的对象实例。两个线程不能

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) { ....        }    }
  • 或者,如果您不想将其设为静态,则可以传入该对象以进行锁定。

您的输出可能类似于以下内容:

  1. gaston
    线程(可能)开始第一和电话
    bow(alphonse)
  2. 这将锁定
    gaston
    对象并输出:
    Gaston: Alphonse has bowed to me!
  3. 它呼吁
    alphonse.bowBack(this)
  4. 该调用将锁定
    alphonse
    对象并输出:
    Alphonse: Gaston has bowed back to me!
  5. alphonse.bowBack(this)
    退出,解锁
    alphonse
    对象。
  6. gaston.bow(alphonse)
    退出,解锁
    gaston
    对象。
  7. 然后
    gaston
    线程退出。
  8. alphonse
    线程(可能)明年开始,并呼吁
    bow(gaston)
  9. 这将锁定
    alphonse
    对象并输出:
    Alphonse: Gaston has bowed to me!
  10. 它呼吁
    gaston.bowBack(this)
  11. 该调用将锁定
    gaston
    对象并输出:
    Gaston: Alphonse has bowed back to me!
  12. gaston.bowBack(this)
    退出,解锁
    gaston
    对象。
  13. alphonse.bow(gaston)
    退出,解锁
    alphonse
    对象。

这可能以许多不同的顺序发生。

alphonse
即使
start()
稍后会调用该方法,该线程也可以首先运行。锁唯一使您无法
alphonse.bow(...)
使用的
alphonse.bowBack(...)
是当前正在运行的if
的调用。正如@ user988052指出的那样,由于每个线程都锁定自己的对象,然后尝试锁定另一个对象,因此很容易会出现死锁。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414041.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号