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

Java中的同步如何工作

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

Java中的同步如何工作

在Java中,每个函数都

Object
提供了
synchronize
在其上锁定或锁定线程的功能。同步方法时,该方法将其对象实例用作锁。在你的示例中,方法
bow
bowBack
都属于
synchronized
,并且都位于同一类中
Friend
。这意味着任何执行这些方法的线程都将在
Friend
实例上作为其锁进行同步。

一系列将导致死锁的事件是:

  1. 第一个线程调用开始
    alphonse.bow(gaston)
    ,这是
    synchronized
    在上
    alphonse
    Friend
    对象。这意味着线程必须从该对象获取锁。
  2. 第二个线程开始通话
    gaston.bow(alphonse)
    ,这是
    synchronized
    在上
    gaston
    Friend
    对象。这意味着线程必须从该对象获取锁。
  3. 现在启动的第一个线程将调用
    bowback
    并等待
    gaston
    释放锁定。
  4. 现在启动的第二个线程将调用
    bowback
    并等待
    alphonse
    释放锁定。

为了更详细地显示事件的顺序:

  1. main()
    开始在主要
    Therad
    中执行(称为线程1),创建两个Friend实例。到目前为止,一切都很好。
  2. 主线程使用代码开始其第一个新线程(称为线程#2)
    new Thread(new Runnable() { ...
    。线#2的呼叫
    alphonse.bow(gaston)
    ,这是
    synchronized
    在上
    alphonse Friend
    对象。因此,线程#2获取alphonse对象的“锁” 并进入bow方法。
  3. 时间片在这里发生,原始线程有机会进行更多处理。
  4. 与第一个线程一样,主线程将启动另一个新线程(称为线程#3)。线程#3调用
    gaston.bow(alphonse)
    ,它在
    gaston Friend
    对象上同步。由于还没有人获得
    gaston
    对象实例的“锁”,因此线程#3成功获取了此锁并进入了
    bow
    方法。
  5. 这里发生一个时间片,线程2获得了进行更多处理的机会。
  6. 线#2现在调用
    bower.bowBack(this)
    ;与
    bower
    正在该实例的引用
    gaston
    。这在逻辑上等效于的调用
    gaston.bowBack(alphonse)
    。因此,此方法
    synchronized
    gaston
    实例上。该对象的锁已被获取,并由另一个线程(线程3)持有。因此,线程#2必须等待gaston释放锁定。线程进入等待状态,从而允许线程#3进一步执行。
  7. 现在
    bowback
    ,线程#3进行了调用,在这种情况下,它在逻辑上与call相同
    alphonse.bowBack(gaston)
    。为此,它需要获取
    alphonse
    实例的锁,但是此锁由线程#2持有。现在,该线程已进入等待状态。

现在,你处于无法执行任何线程的位置。线程#2和线程#3都在等待释放锁。但是,如果没有Thread进展,则无法释放任何锁定。但是没有释放锁,任何线程都无法取得进展。

因此:死锁!

死锁通常取决于发生的事件的特定顺序,这可能使调试变得困难,因为它们可能难以重现。



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

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

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