当前位置: 首页 > 面试题库 >

这是饥饿吗?

左恺
2023-03-14
问题内容

我找到了一段似乎线程饥饿的代码。下面是一个简化的示例。这是饥饿的例子吗?线程不终止的原因是什么?

注意:将睡眠更改为1有时会导致终止。注释掉的Thread.yield()将解决问题(对我来说)。

public class Foo {

    public static boolean finished = false;

    public static void main(String[] args) {

          Runnable worker = new Runnable() {

                 @Override
                 public void run() {

                      try {
                           Thread.sleep(10);
                      } catch (InterruptedException e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }

                      finished = true;
                 }
            };

            new Thread(worker).start();

            while (!finished) {
//          Thread.yield();
        }
    }
}

问题答案:

您可能需要了解Java内存模型。多线程不仅涉及 交织 线程的行为,还涉及多线程。它是关于一个线程到另一个线程的动作 可见性

这个问题的根本在于面对并发性时需要进行积极的优化:确保线程之间的内存一致性的任何机制都是昂贵的,并且大部分(大部分)数据不会在线程之间共享。因此,默认情况下volatile,没有显式标记或受锁保护的数据将被视为
线程本地 的(当然,没有严格的保证)。

在您的情况下,finished是这样一个变量,如果它使运行时令人愉悦,则可以将其视为线程本地的。它确实令人满意,因为

while (!finished);

循环可以重写为

if (!finished) while (true);

如果您在循环内进行了任何重要的工作,它的性能会更好一些,因为finished不会不必要地重复读取操作,因此可能会破坏整个CPU缓存行。

上面的讨论足以回答您的直接问题“这是饥饿吗”:循环未完成的原因不是饥饿,而是无法看到其他线程的写入。



 类似资料:
  • 我试图使一个插件,消除饥饿从我的世界。但是,我找不到它的事件! 有没有一个叫玩家失去饥饿感的活动? 像?

  • 维基百科上说,下面的代码“增加了不允许任何线程饿死的限制”,我不明白为什么没有饿死。例如:如果有很多作者在任何读者之前到达,并且第一个作者花了很长时间完成他的写作,那么r可能会达到一些大的负数,比如说-12345,然后读者开始与作者一起到达,不知怎的,操作系统总是选择writer来接收信号量,而不是reader,如果那样的话,读者会挨饿,这是对的还是我错了?链接:读者和作者问题 请看链接中的第三个

  • 主要内容:死锁,活锁,饥饿,总结本节我们来介绍一下死锁、活锁和饥饿这三个概念。 死锁 死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 死锁发生的条件有如下几种: 1) 互斥条件 线程对资源的访问是排他性的,如果一个线程对占用了某资源,那么其他线程必须处于等待状态,直到该资源

  • 问题内容: 该代码实际上是从Java并发中获取的,根据作者的说法,这里发生了“ ThreadStarvtionDeadlock”。请帮我找到ThreadStarvationDeadlock在这里和哪里发生的情况吗?提前致谢。 问题答案: 死锁和饥饿发生在以下行: 怎么样? 如果我们在程序中添加一些额外的代码,它将发生。可能是这样的: 导致死锁的步骤: 通过实现的类将任务提交给渲染页面。 开始在单独

  • 我对和使用了RXJava。我知道他们不是在一条流上并行化排放。换句话说,单个排放流只会放在一个线程上,对吗?我下面的测试似乎表明了这一点。我的理解是,您还必须调度器,如,以在单个流上并行化发射。 同样,如果是这种情况,那么调度器会发生线程饥饿吗?如果我的计算调度程序有5个线程,但我有超过5个长时间运行的异步流正在处理,有没有可能出现饥饿?或者这不太可能仅仅是因为RXJava的性质?

  • 我对这段代码有一个问题。这是典型的读者-作家问题。我按照这个维基百科页面上的伪代码找到了第一个让作者挨饿的问题。我想知道我实际上是如何注意到作家们正在挨饿的。 我试着把shared_variable的打印声明放在不同的地方,但这并没有给我太多的洞察力。但也许我只是不明白发生了什么。有人能向我解释一下我是如何直观地看到饥饿发生的吗?谢谢你!读取器或写入器尝试读取或写入的次数作为命令行参数给出。